3

すべての結果を取得したいのですがsolrj、に10個のドキュメントを追加するとSolr、例外は発生しませんが、10個を超えるドキュメントを追加するSolrと、例外が発生します。私はそれを検索します、私はこれについてこの例外を受け取ります、最初のページのhttp:// localhost:8983 / solr /ブラウズ10ドキュメントで、11番目のドキュメントは2番目のページに行きます。どうすればすべての結果を得ることができますか?

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

もっと簡単な方法:

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 に答える
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 に答える
6

numFound は、クエリに一致した結果の総数を示します。

ただし、デフォルトでは、Solr は、パラメーターrowsによって制御される上位 10 件の結果のみを返します。
numFound を繰り返し処理しようとしていますが、返される結果が 10 しかないため、失敗します。
Iteration には rows パラメータを使用する必要があります。

次の結果セットを取得するには、別の開始パラメーターを使用して Solr に再クエリを実行する必要があります。これは、非常に重い操作である一度にすべての結果を取得する必要がないように、ページネーションをサポートするためです。

于 2012-12-24T11:03:39.377 に答える