2013-02-14 6 views
10

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

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

私がこれを読んで理解していないのは、FQがこれまでのすべての答えと本に基づいて、ずっと優れているようだから誰もQを使う理由です。

を除いて、私には両方とも存在する理由が考えられます。

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

  • 私の文書があります:日付、クライアント、レポート、およびいくつかの他のフィールド
  • 1営業日= 350万件のドキュメントを。
  • 合計の文書数は2億5,000万であり、カウント(60日付* 8000クライアント* 1000レポート)
  • 私はファセットの日付、クライアント、レポートのファセットを使用しています。
  • UI全体は、任意の電子商取引サイトのように見えます。例:Amazon、左側にファセットがあります。
  • スコアリングは使用されません。

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

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

A事実:私たちは、それが探索ではなくゆっくりとしているファセットであると判断しました。

質問:

A)Q =日付:20130214とクライアント:

この検索条件、およびクエリを記述するために、これらの方法を考えるジョー& facet.field =日付& facet.field =クライアント...

B)Q =日付:20130214 & FQ =クライアント:ジョー& facet.field =日付& facet.field =クライアント...

C)Q =クライアント:ジョー& FQ =日付:20130214 & facet.field =日付& facet.field =クライアント...

D)Q = *:* & FQ =日付:20130214 & FQ =クライアント:ジョー・& facet.field =日付& facet.field =クライアント...あなたは最高、なぜだろうと思います上記の

  • ?覚えておいて、ほとんどのクエリは、最初にFQフィルタリングが行われた後、Q条件が適用されるか、または逆の場合に、20130214
  • に対して実行されます。

今日私はD)がすべてのケースで使用されていますが、これは間違っていると思われ、Solr(バージョン3.6)でOOMを引き起こしています。

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

答えて

3

あなたの質問に答えるために:あなたのビジネスルールに基づいて

  • 、私はあなたが常に最新の値によって(フィルタリング)の結果を制限しているし、それが聞こえるので、あなたがFQ値に日付を入れることを示唆しています日付値のようにSolrによって再利用される可能性があります。 Qには、必要に応じてランダムなクライアントとレポートの値を検索することができます。

  • あなただけ私はあなたが<id field>は、インデックス内のドキュメントのIDであり、またrows=0を設定q=<id field>:*を使用することをお勧め面を見せているため、ユーザーはまず、UIに来ます。再度fq値の日付制限を使用してください。 rows=0を指定すると、唯一のクエリのファセットを生成Solr - Getting facet counts without returning results

+1

ご返信ありがとうございます。私がfq = 20130214&q = client:Paigeと言う場合、Solrは最初にクライアントのために2億5,000万の文書をスキャンしなければならないのでしょうか?それとも、それらをフィルタリングして日付20130214のものだけを残しますか?もしそうなら、最初にすべてのものを見つけ出し(350万文書)、クライアントに基づいてフィルタリングする方が効率的ではないでしょうか?さらに大きな疑問:両方のシナリオを試すことができるツールはないように思われるので、どうすればわかるでしょうか。 –

+1

はい、フィルタ検索は、メイン検索が実行された後に実行されます。しかし、あなたの文書番号に基づいて、 'q = 20130214&fq = client:Paige'を切り替えて、日付が書かれた350万の文書を検索し、それらをフィルタリングして正しいクライアント。どのように正しいアプローチを決定するのは難しくなく、速くない、それはニーズとシナリオに依存する。クエリをテストするためのツールとして、私はSolrMeterを強く勧めます - http://code.google.com/p/solrmeter/ –

+0

Thanks Paige。 あなたは2つの異なる返答で(ビジネスルールと数字に基づいて)異なる回答をしたので、元の質問を明確にしました。 もう一度ご覧ください。 また、SolrMeterは、Solrがどのように処理しているか、どのような順番で、どのような順番で、何が見つかったかなどを示していません。 Sybase(またはRDBMS)をよく知っている方は、 'set showplan on'と同じです。 ありがとう、 - ドミトリー。 –

17

qクエリはリクエストのメインクエリで参照します。
実際に複数のフィールドを検索することができます。
qクエリは、ドキュメントのそれぞれのスコアがどれであるかを決定し、関連性の計算に参加します。

q=*:*は、同じスコアのすべてのドキュメントを返します。

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

検索するには、常にqを使用するのが理想的です。結果をフィルタリングしたり制限したりする場合は、fqを使用してください。

ファセットは単なる結果のアドオンに過ぎず、結果には影響しません。

+0

これらの有益な回答をすべてSOを送信してくれてありがとう! –

+0

なぜdownvote?コメントが追加されましたので、私の答えが改善されるようになりました。 – Jayendra

+1

@Jayendra基本的な質問:fqは文書をフィルタリングするために使用され、キャッシュを介した後続の検索に役立ちます。私は、100Mのドキュメントが100のカテゴリにわたって均一に広がっているとします。クエリ(q)とfq = cat:5を使用すると、最初にその猫のドキュメントしか検索できません:5または100Mすべてを検索してcat:5をフィルタリングしますか?前者が有効な場合は、検索速度も速くなります(後続の検索でfilterCacheに当たっただけではありません)。 – Ethan