h3455125
2017-08-05 08:58
采纳率: 100%
浏览 1.0k

java编程中使用solrj,数据传递过程中出了问题,请帮忙看看到底是哪里出了问题并告诉我一下原因

使用tomcat7,myeclipse2017 C1,JDK 1.7,maven 3.2.3,solr 4.10.2

通过浏览器访问http://search.taotao.com/search.html?q=tcl ,进入controller后,

错误信息:

图片说明

报错1

controller:

图片说明

service:

图片说明

图片说明

pojo:图片说明

solr中的schema.xml中的cid

图片说明

solr中cid的属性:

图片说明

自己debug后发现映射过程中出问题的地方:

图片说明

对queryResponse进行查看:

图片说明

发现确实取到值了并贴出:

图片说明

说一下程序中的数据来源吧,mysql中是直接导入的几千条数据

这是表的结构

然后用solrj将表中的数据导入到solr服务器中 的代码:



 public class DataImportTest {

    private HttpSolrServer httpSolrServer;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Before
    public void setUp() throws Exception {
        // 在url中指定core名称:taotao
        //"http://solr.taotao.com/#/taotao"--界面操作
        String url = "http://solr.taotao.com/taotao";//服务地址
        HttpSolrServer httpSolrServer = new HttpSolrServer(url); //定义solr的server
        httpSolrServer.setParser(new XMLResponseParser()); // 设置响应解析器
        httpSolrServer.setMaxRetries(1); // 设置重试次数,推荐设置为1
        httpSolrServer.setConnectionTimeout(500); // 建立连接的最长时间

        this.httpSolrServer = httpSolrServer;

    }

    @Test
    public void testData() throws Exception{
        String url = "http://manage.taotao.com/rest/item?page={page}&rows=100";
        int page = 1;
        int pageSize=0;
        do {
            String u = StringUtils.replace(url, "{page}", ""+page);
            String jsonData =doGet(u);
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            String rowsStr = jsonNode.get("rows").toString();
            List<Item> items=MAPPER.readValue(rowsStr, 
                    MAPPER.getTypeFactory().constructCollectionType(List.class, Item.class));
            pageSize=items.size();
            httpSolrServer.addBeans(items);
            this.httpSolrServer.commit();
            page++;
        } while (pageSize == 100);
    }

    private String doGet(String url) throws Exception{
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 创建http GET请求
        HttpGet httpGet = new HttpGet(url);

        CloseableHttpResponse response = null;
        try {
            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
               return  EntityUtils.toString(response.getEntity(), "UTF-8");

            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
        return null;

    }

}


然后就是出了文章开头报的错误。

图片说明

在后续的编程过程中,我发现将item中的cid改为Integer,可以解决这个报错。

但是通过后台新增的数据,查询就会报错,报的错为

报错2

与之前报的错(文章第一张图中的报错)刚好相反。但是将Item类中的cid改为Long型,那么查询新增数据(自己添加的数据)就没问题,查询导入的数据则报文章开头帖子中的错。

这样,我的分析是导入的数据可能存在问题,是否是导入过程中将本来为long型的cid转为了Integer类型?

但是我确实不知道在哪个地方出错了,麻烦懂的大神帮忙给看看,并告之我详情,十分之感谢~需要什么地方的代码请跟我说,谢谢

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • Q544471255 2017-08-05 11:24
    已采纳

    1.可以先参考下:http://www.mamicode.com/info-detail-1774772.html
    2.这个如果不是公司项目的话,可以发下源码调一下,不然完全不知道怎么走。

    如果只是查询导入的数据报错,你可以先改成Integer,然后清空之前导入的数据,重新导入一遍在试试查询.

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题