クエリ、フィルター、またはその2つの組み合わせをいつ使用すべきかについての説明がありません。それらの違いは何ですか?誰か説明していただけますか?
クエリ、フィルター、またはその2つの組み合わせをいつ使用すべきかについての説明がありません。それらの違いは何ですか?誰か説明していただけますか?
回答:
違いは単純です。フィルターはキャッシュされ、スコアに影響しないため、クエリより高速です。一見持ってここを過ぎます。クエリは通常、ユーザーが入力するものであり、ほとんど予測不可能ですが、フィルターは、ユーザーがファセットを使用するなど、検索結果を絞り込むのに役立ちます。
これは公式文書が言うことです:
原則として、クエリの代わりにフィルタを使用する必要があります。
- バイナリのはい/いいえ検索
- 正確な値のクエリ
原則として、フィルターの代わりにクエリを使用する必要があります。
- 全文検索用
- 結果は関連性スコアに依存します
たとえば、インデックスmyindex
に3つのドキュメントが含まれているとします。
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
クエリ:ドキュメントとクエリの一致度
hello sam
(keywordを使用must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
前者はクエリ内の両方の単語に一致するため、ドキュメントに"Hello world! I am Sam."
はより高いスコアが割り当てられ"Hello world!"
ます。ドキュメントにスコアが付けられます。
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
フィルター:ドキュメントがクエリに一致するかどうか
hello sam
(キーワードを使用filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
hello
またはを含むドキュメントsam
が返されます。ドキュメントはスコアリングされません。
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
同じにいくつかの追加。最初にフィルターが適用され、次にその結果に対してクエリが処理されます。ドキュメントごとのバイナリのtrue / falseの一致を保存するには、bitSet配列と呼ばれるものを使用します。このBitSet配列はメモリ内にあり、これはフィルターが2回目にクエリされたときに使用されます。このように、ビットセット配列のデータ構造を使用して、キャッシュされた結果を利用できます。
ここでもう1つ注意すべき点は、フィルターキャッシュはリクエストが実行されたときにのみ作成されるため、2番目のヒットからのみであり、実際にはキャッシュの利点を得られます。
しかし、これを超えるには、ウォーマーAPIを使用できます。ウォーマーAPIに対してフィルターを使用してクエリを登録すると、新しいセグメントがライブになるたびにこれが確実に実行されます。したがって、最初の実行自体から一貫した速度が得られます。
基本的に、クエリは、スコアリングを使用してドキュメントで検索を実行する場合に使用されます。また、フィルターを使用して、クエリを使用して取得した結果のセットを絞り込みます。フィルターはブール値です。
たとえば、zomatoのようなレストランのインデックスがあるとします。次に、基本的に検索キーワードである「ピザ」を提供するレストランを検索します。
したがって、クエリを使用して「ピザ」を含むすべてのドキュメントを検索し、いくつかの結果を取得します。
たとえば、ピザを提供し、評価が4.0以上のレストランのリストが必要だとします。
したがって、クエリでキーワード「ピザ」を使用し、4.0と評価するためのフィルターを適用する必要があります。
何が起こるかというと、フィルターは通常、インデックスのクエリによって取得された結果に適用されます。
Filters
->このドキュメントは一致しますか?バイナリのはいまたはいいえの答え
Queries
->このドキュメントは一致しますか?それはどの程度よく一致しますか?スコアリングを使用します
Elasticsearchのバージョン2以降、フィルターとクエリが統合され、どのクエリ句も(コンテキストに応じて)フィルターまたはクエリとして使用できます。バージョン1と同様に、フィルターはキャッシュされるため、スコアリングが重要でない場合は使用する必要があります。