226

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

4

8 に答える 8

221

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

于 2013-01-30T09:37:07.903 に答える
110

これは公式ドキュメントが言っていることです:

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

  • バイナリのyes/no検索の場合
  • 正確な値に関するクエリの場合

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

  • 全文検索用
  • ここで、結果は関連性スコアに依存します
于 2014-08-10T13:48:24.863 に答える
21

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

インデックス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(キーワードを使用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:クエリとフィルターのコンテキストを参照してください。

于 2017-12-20T03:58:02.067 に答える
17

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

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

于 2018-02-09T09:20:45.247 に答える
13

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

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

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

于 2015-02-24T02:40:37.103 に答える
11

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

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

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

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

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

何が起こるかというと、フィルターは通常、インデックスを照会して得られた結果に適用されます。

于 2014-11-23T05:50:34.023 に答える
0

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

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

于 2020-05-07T07:20:22.960 に答える
0

クエリ:スコアを計算します。したがって、関連性でソートされた結果を返すことができます。フィルタ:スコアを計算しないため、キャッシュがより速く簡単になります。

于 2020-08-15T04:56:05.343 に答える