14

私は同じ質問に対するすべての回答を読みましたが、ユースケースにどの回答を使用すべきか、またその理由が明確ではありません。どちらも同じ結果を返します。誰かが正しく答えたように、「FilterQueryがキャッシュされて全体的なクエリ時間が速くなる」ことを理解しています。

また、「フィルタリングではファセットのタグ付けもできるため、ファセットにタグを付けて、クエリに対して返されるすべてのファセットを含めることができます」ということも理解しています。他の誰かも正しく答えました。

これを読んでも理解できないのは、私が見たすべての回答と本に基づいて、FQの方がはるかに優れているように見えるため、なぜ誰もがQを使用するのかということです。

例外として、おそらく両方が存在する理由があると確信しています。

私が望むのは、私のユースケースに最適なものを見つけ出すことです.ドキュメントには有用な例が非常に欠けています.

  • 私のドキュメントには、日付、クライアント、レポート、およびその他のフィールドがあります
  • 1 営業日 = 350 万ドキュメント。
  • ドキュメントの総数は 2 億 5000 万であり、数えています (60 の日付 * 8000 のクライアント * 1000 のレポート)
  • 日付、クライアント、レポートをファセットし、ファセットのタグ付けを使用します。
  • UI 全体は、左側にファセットがある Amazon などの e コマース サイトのように見えます。
  • スコアリングは使用しません。

ビジネス ルール #1: 日付はすべてのクエリに常に存在する必要があります。

ビジネス ルール #2: クエリの 99% は最新の日付を使用しますが、ランダムなクライアントとランダムなレポートを使用します。

事実: 遅いのは検索ではなくファセットであると判断しました。

質問:

この検索条件と、クエリを作成する次の方法があるとします。

A) q=date:20130214 AND client:Joe & facet.field=date & facet.field=client...

B) q=date:20130214 & fq=client:Joe & facet.field=date & facet.field=client...

C) q=client:Joe & fq= date:20130214 & facet.field=date & facet.field=client...

D) q=*:* & fq=date:20130214 & fq=client:Joe & facet.field=date & facet.field=client...

  • 上記のどれが一番良いと思いますか?その理由は? ほとんどのクエリは 20130214 に対して実行されることに注意してください。
  • FQ フィルタリングで最初に行われ、次に Q 条件が適用されますか、それともその逆ですか?

現在、すべてのケースで D) が使用されていますが、これは間違っていると思われ、Solr (バージョン 3.6) で OOM が発生しています。

ご協力ありがとうございました!

4

2 に答える 2

25

qquery は、リクエストのメイン クエリです。
複数のフィールドを実際に検索できるようにするものです。
qクエリは、各ドキュメントのスコアを決定するため、関連性の計算に参加します。

q=*:*同じスコアを持つすべてのドキュメントを返すだけです。

fqは、ドキュメントのフィルタリングに使用されるフィルター クエリであり、検索とは関係ありません。
したがって、フィルタリングしたい固定値がある場合は、フィルターを使用して結果を制限する必要があります。
fq結果の採点には影響しません。
フィルタリング中、Solr はフィルター キャッシュを使用して、後続のフィルター クエリのパフォーマンスを向上させます。

したがって、理想的には、要件が何を要求するかを確認する必要があります。検索したい場合は常に を使用しq、結果をフィルタリング/制限したい場合は を使用する必要がありますfq

ファセットは結果への単なるアドオンであり、結果には影響しません。

于 2013-02-14T02:13:12.237 に答える
3

あなたの質問に答えるには:

  • ビジネスルールに基づいて、日付をfq値に入れることをお勧めします。これは、結果を常に日付値で制限(フィルタリング)しており、日付値はSolrで再利用できるように思われるためです。また、Qには、必要に応じてランダムなクライアントとレポート値の検索を含めることができます。

  • ユーザーが最初にUIにアクセスしたときは、ファセットのみを表示しているため、インデックス内のドキュメントIDは q=<id field>:*どこにあるかを使用し、を設定することをお勧めします。fq値の日付制限を再度使用します。指定すると、ファセットのみのクエリが生成されます。Solrを参照してください-結果を返さずにファセットカウントを取得します<id field>rows=0rows=0

于 2013-02-14T02:08:22.127 に答える