クエリとフィルター


198

クエリ、フィルター、またはその2つの組み合わせをいつ使用すべきかについての説明がありません。それらの違いは何ですか?誰か説明していただけますか?


46
公式文書は実際にはあまり明確ではありません
ギーカゾイド2014年

2
:そこのように見えますが、より高度な説明をページに登場しているelastic.co/guide/en/elasticsearch/guide/master/...
ドミトリーPolushkin

6
クエリとフィルタは ES 2.0でマージされることに注意してください。そのため、クエリとフィルタについて述べられ、書かれていることのほとんどはもう適用されません。また、この変更を発表した公式ブログの投稿も確認してください。
Val

回答:


201

違いは単純です。フィルターはキャッシュされ、スコアに影響しないため、クエリより高速です。一見持ってここを過ぎます。クエリは通常、ユーザーが入力するものであり、ほとんど予測不可能ですが、フィルターは、ユーザーがファセットを使用するなど、検索結果を絞り込むのに役立ちます。


19
そうです、もしユーザーがグーグルタイプの検索をしているなら、私はクエリを使うでしょうか?彼らがドロップダウンから可能な値を選択している場合(たとえば、請求書カウント> 50)、これはフィルターになりますか?
Jonesie 2013年

4
はい、そうです。ドキュメントのセット全体を何らかのメトリックで制限する必要があるときはいつでも、それは通常フィルターが適切な場合です。したがって、年齢、長さ、サイズなどによって
Zach

私のソリューションでは、同じリクエストでフィルターとクエリを使用しており、テストデータベースでは非常に高速です。ライブデータをすぐに取得して、実際の速度を確認します。
Jonesie 2013年

@Zach明確に言うと、マルチテナントシステム-テナント内のユーザーに対する権限を持つ-では、テナント/認証情報はすべてのクエリに追加されるフィルター(つまり、フィルターされたクエリ)のようです。正しい?
Scott Willeke 2013

4
@activescottええ、それは私がすることです。「ユーザーエイリアス」が常に適切なフィルタを適用するように、フィルタリングされたエイリアスを設定することもできます。管理を容易にし、クエリを更新するためのコード変更、クエリの余分な余計なものなどを必要としない
Zach

99

これは公式文書が言うことです:

原則として、クエリの代わりにフィルタを使用する必要があります。

  • バイナリのはい/いいえ検索
  • 正確な値のクエリ

原則として、フィルターの代わりにクエリを使用する必要があります。

  • 全文検索用
  • 結果は関連性スコアに依存します

ドキュメントを削除する場合、可能であればフィルターを使用する必要がありますか?キャッシュされたくない
Rytek

ドキュメントを削除する場合、スコアは必要ありません。また、全文検索を行う必要もありません。したがって、削除するかどうかを判断するだけでよいので、これはよりフィルタになります。filter-query-context
nonNumericalFloat

13

例(自分で試してください)

たとえば、インデックス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."
     }
   ...

全文検索またはスコアリングが必要でない限り、パフォーマンスを高速化するために頻繁に使用されるフィルターはElasticsearchによって自動的にキャッシュされるため、フィルターが推奨されます。Elasticsearch:クエリとフィルターのコンテキストを参照してください


11

同じにいくつかの追加。最初にフィルターが適用され、次にその結果に対してクエリが処理されます。ドキュメントごとのバイナリのtrue / falseの一致を保存するには、bitSet配列と呼ばれるものを使用します。このBitSet配列はメモリ内にあり、これはフィルターが2回目にクエリされたときに使用されます。このように、ビットセット配列のデータ構造を使用して、キャッシュされた結果を利用できます。

ここでもう1つ注意すべき点は、フィルターキャッシュはリクエストが実行されたときにのみ作成されるため、2番目のヒットからのみであり、実際にはキャッシュの利点を得られます。

しかし、これを超えるには、ウォーマーAPIを使用できます。ウォーマーAPIに対してフィルターを使用してクエリを登録すると、新しいセグメントがライブになるたびにこれが確実に実行されます。したがって、最初の実行自体から一貫した速度が得られます。


1
面白い!クエリの前にフィルターが発生することを知りませんでした。フィルターのキャッシングは今やもっと理にかなっています。
2015

常にではない。フィルターされたクエリと定数スコアクエリの基本的な違い。一定のスコアは常に最初にクエリを実行し、次にフィルターを適用します。フィルターされたクエリでさえ、フィルターの前に実行できる設定があります。
piyushGoyal

10

基本的に、クエリは、スコアリングを使用してドキュメントで検索を実行する場合に使用されます。また、フィルターを使用して、クエリを使用して取得した結果のセットを絞り込みます。フィルターはブール値です。

たとえば、zomatoのようなレストランのインデックスがあるとします。次に、基本的に検索キーワードである「ピザ」を提供するレストランを検索します。

したがって、クエリを使用して「ピザ」を含むすべてのドキュメントを検索し、いくつかの結果を取得します。

たとえば、ピザを提供し、評価が4.0以上のレストランのリストが必要だとします。

したがって、クエリでキーワード「ピザ」を使用し、4.0と評価するためのフィルターを適用する必要があります。

何が起こるかというと、フィルターは通常、インデックスのクエリによって取得された結果に適用されます。


リクエストボディの例を提供できませんか?

9

Filters->このドキュメントは一致しますか?バイナリのはいまたはいいえの答え

Queries->このドキュメントは一致しますか?それはどの程度よく一致しますか?スコアリングを使用します


0

Elasticsearchのバージョン2以降、フィルターとクエリが統合され、どのクエリ句も(コンテキストに応じて)フィルターまたはクエリとして使用できます。バージョン1と同様に、フィルターはキャッシュされるため、スコアリングが重要でない場合は使用する必要があります。

ソース:https : //logz.io/blog/elasticsearch-queries/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.