28

のようなクエリを実行し"Address:Jack*"ました。結果ページに 100 件のドキュメントを表示numFound = 5214します (デフォルトの表示結果を 10 件から 100 件に変更しました)。

すべてのドキュメントを取得するにはどうすればよいですか。

4

8 に答える 8

38

&rows=2147483647をしていたことを覚えています

2,147,483,647 は整数の最大値です。それよりも大きな数値を一度使用し、int に解析できなかったために NumberFormatException が発生したことを思い出します。彼らが最近 Long を使用しているかどうかはわかりませんが、通常は 20 億行で十分です。

ちょっとした注意:
本番環境でこれを行う予定がある場合は注意してください。* : * のようなクエリを実行し、インデックスが大きい場合、そのクエリで数ギガバイトを転送できます。
多くのドキュメントがないことがわかっている場合は、整数の最大値を使用してください。

一方、1 回限りのスクリプトを実行していて、すべての結果 (ドキュメント ID など) をダンプする必要がある場合は、クエリが返されるまで 3 ~ 5 分待つことを気にしないのであれば、この方法が有効です。

于 2012-04-09T22:34:27.090 に答える
7

&rows=2147483647 を使用しないでください

本番環境では行の値として Integer.MAX_VALUE(2147483647) を使用しないでください。solr はこのサイズのキューを事前に割り当てるため、結果セットが小さい場合でもクエリの速度が大幅に低下します。https://issues.apache.org/jira/browse/SOLR-7580を参照してください。

Deep Paging を使用することを強くお勧めします。

startシンプルなページネーションは、読むドキュメントが少なく、rowsパラメーターをいじるだけでよい場合に簡単です。しかし、これは多くのドキュメント、つまり数十万、さらには数百万のドキュメントがある場合には実行可能な方法ではありません。
これは、Solr サーバーをひざまずかせるようなものです。

人間のユーザーに検索結果を表示する典型的なアプリケーションの場合、ほとんどのユーザーは検索結果の最初の数ページをドリルダウンすることを気にしないため、これはあまり問題にならない傾向があります。クエリに一致するすべてのドキュメントは、深刻な禁止事項になる可能性があります。

これは、Web サイトがあり、検索結果をページングしている場合、実際のユーザーはそこまでは考えず、一方でスパイダーやスクレーパーが Web サイトのすべてのページを読み取ろうとした場合に何が起こるかを考えることを意味します。

今、私たちはDeep Pagingについて話しています。

この素晴らしい投稿を読むことをお勧めします。

https://lucidworks.com/post/coming-soon-to-solr-effective-cursor-based-iteration-of-large-result-sets/

そして、このドキュメントページを見てください:

https://solr.apache.org/guide/pagination-of-results.html

そして、カーソルを使用してページネーションする方法を説明しようとする例を次に示します。

SolrQuery solrQuery = new SolrQuery();
solrQuery.setRows(500);
solrQuery.setQuery("*:*");
solrQuery.addSort("id", ORDER.asc);  // Pay attention to this line
String cursorMark = CursorMarkParams.CURSOR_MARK_START;
boolean done = false;
while (!done) {
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
    QueryResponse rsp = solrClient.query(solrQuery);
    String nextCursorMark = rsp.getNextCursorMark();
    for (SolrDocument d : rsp.getResults()) {
            ... 
    }
    if (cursorMark.equals(nextCursorMark)) {
        done = true;
    }
    cursorMark = nextCursorMark;
}
于 2017-04-27T09:17:25.337 に答える
6

すべての結果を返すことは、パフォーマンスが非常に遅くなるため、決して良い選択肢ではありません。
あなたのユースケースについて言及できますか?

また、Solrパラメーターは、返される結果の数を調整するのに役立ちます。
ただし、すべての結果を返すように行を調整する方法はないと思います。値として -1 を取りません。
そのため、返されるすべての結果に対して高い値を設定する必要があります。

于 2012-04-06T06:39:14.713 に答える
0

他の回答が指摘したように、行を最大整数に設定して、クエリのすべての結果を返すことができます。ただし、 pagination の Solr 機能を使用し、cursorMark API を使用してすべての結果を返す関数を作成することをお勧めします。その要点は、cursorMark パラメーターを '*' に設定し、ページ サイズ (rows パラメーター) を設定し、各結果で次のページの cursorMark を取得するため、cursorMark のみを使用して同じクエリを実行することです。最後の結果から与えられます。このようにして、よりパフォーマンスの高い方法で、必要な結果の量をより柔軟に設定できます。

于 2016-07-30T21:57:37.417 に答える
0

Solarium php クライアントを介して dismax/edismax 内のすべてのドキュメントを選択する場合、通常のクエリ構文:は機能しません。すべてのドキュメントを選択するには、ソラリウム クエリのデフォルトのクエリ値を空の文字列に設定します。これは、Solarium のデフォルトのクエリが:であるため必須です。また、代替クエリを:に設定します。Dismax/eDismax 通常のクエリ構文は:をサポートしていませんが、代替クエリ構文はサポートしています。

詳しくは以下の本を参照

http://www.packtpub.com/apache-solr-php-integration/book

于 2013-12-18T07:36:27.923 に答える