3

我想得到所有结果solrj,我添加 10 个文档Solr,我没有得到任何异常,但是如果我添加超过 10 个文档,Solr我会得到异常。我搜索了这个,我得到了这个例外,在第一页的http://localhost:8983/solr/browse 10 文档中,第 11 个文档转到第二页。我怎样才能得到所有的结果?

String qry="*:*";
                CommonsHttpSolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr");
      QueryResponse rsp=server.query(new SolrQuery(qry));
      SolrDocumentList docs=rsp.getResults();  
                        for(int i=0;i<docs.getNumFound();i++){

                            System.out.println(docs.get(i));                    
    }

线程“AWT-EventQueue-0”中的异常 java.lang.IndexOutOfBoundsException:索引:10,大小:10

4

4 回答 4

8
    Integer start = 0;

    query.setStart(start);
    QueryResponse response = server.query(query);
    SolrDocumentList rs = response.getResults();
    long numFound = rs.getNumFound();
    int current = 0;
    while (current < numFound) {

        ListIterator<SolrDocument> iter = rs.listIterator();
        while (iter.hasNext()) {
            current++;

            System.out.println("************************************************************** " + current + "   " + numFound);
            SolrDocument doc = iter.next();
            Map<String, Collection<Object>> values = doc.getFieldValuesMap();

            Iterator<String> names = doc.getFieldNames().iterator();
            while (names.hasNext()) {
                String name = names.next();
                System.out.print(name);
                System.out.print(" = ");

                Collection<Object> vals = values.get(name);
                Iterator<Object> valsIter = vals.iterator();
                while (valsIter.hasNext()) {
                    Object obj = valsIter.next();
                    System.out.println(obj.toString());
                }
            }
        }
        query.setStart(current);
        response = server.query(query);
        rs = response.getResults();
         numFound = rs.getNumFound();


    }
}
于 2014-09-25T13:17:28.797 回答
8

更简单的方法:

CloudSolrServer server = new CloudSolrServer(solrZKServerUrl);
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setRows(Integer.MAX_VALUE);
QueryResponse rsp;
rsp = server.query(query, METHOD.POST);
SolrDocumentList docs = rsp.getResults();
for (SolrDocument doc : docs) {
    Collection<String> fieldNames = doc.getFieldNames();
    for (String s: fieldNames) {
        System.out.println(doc.getFieldValue(s));
    }
}
于 2015-05-12T04:27:01.923 回答
6

numFound 为您提供与查询匹配的结果总数。

但是,默认情况下,Solr 将仅返回由参数rows控制的前 10 个结果。
您正在尝试迭代 numFound,但是由于返回的结果只有 10 它失败。
您应该将 rows 参数用于迭代。

为了获得下一组结果,您需要使用不同的开始参数重新查询 Solr。这是为了支持分页,这样您就不必一次性提取所有结果,这是一项非常繁重的操作。

于 2012-12-24T11:03:39.377 回答
0

如果您像这样重构代码,它将起作用

String qry="*:*";
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setRows(Integer.MAX_VALUE); //Add me to avoid IndexOutOfBoundExc
CommonsHttpSolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr");
QueryResponse rsp=server.query(query);
SolrDocumentList docs=rsp.getResults();  
for(int i=0;i<docs.getNumFound();i++){
    System.out.println(docs.get(i));
            }

为什么它的答案很简单。

响应告诉您有getNumFound()匹配的文档,但是如果您没有在查询中指定响应必须携带多少个,则此限制将自动设置为 10,

最终仅从找到的 getNumFound() 文档中获取前 10 个文档

出于这个原因,文档列表将只有 10 个元素,并且尝试获取 i > 9(例如 10)的第 i 个元素将带您到

java.lang.IndexOutOfBoundsException

就像你在做实验一样。

PS 我建议你像@Chen Sheng-Lun 一样使用 for 迭代器。

PPS 起初这也让我发疯。

于 2015-09-23T11:29:23.807 回答