1. ホーム
  2. elasticsearch

[解決済み] Elasticsearchでクエリをフィルタリングする適切な方法とは?(フィルタ vs フィルタリングされたクエリ)

2022-03-02 22:38:29

質問

Elasticsearchのquot;filtersとquot;filtered queriesの間に違いがあるかどうかを調べています。

以下の2つのリクエスト例は、私のインデックスに対して実行された場合、同じ結果を返します。

何か微妙な違いがあるのでしょうか?

状況に応じて、どちらかを優先する理由はありますか?

DSLは、1つのトップレベル query , 1つのトップレベル filter :

GET /index/type/_search?_source
{
  "query": {
    "multi_match": {
      "query": "my dog has fleas",
      "fields": ["name", "keywords"]
    }
  },
  "filter": {
    "term": {"status": 2}
  }
}

DSLの提供 のみ トップレベルの query を使用しています。 filtered を構成する。

GET /index/type/_search?_source
{
  "query": {
    "filtered": {
      "query": {
        "multi_match": {
          "query": "my dog has fleas",
          "fields": ["name", "keywords"]
        }
      },
      "filter": {
        "term": {"status": 2}
      }
    }
  }
}

解決方法は?

最初の例は post_filter これはパフォーマンスの観点からは最適とは言えません。フィルタはクエリの前に実行されるので、フィルタリングされたクエリの方が望ましいです。一般に、ドキュメントのスコアリングは単なるブール値での合格/不合格よりもコストがかかるので、フィルタを先に実行させたいものです。そうすれば、クエリを実行する前に結果セットを切り捨てることができます。post_filter では、まずクエリが実行され、結果セット全体がスコアリングされ、その結果に対してフィルタが適用されます。

トップレベルの filter ディレクティブは 1.0 で非推奨となり、次のように名前が変更されました。 post_filter を使用して、その目的と使用方法を明確にしました。

<ブロッククオート

検索におけるトップレベルのフィルタパラメータは post_filter に改名され、検索結果をフィルタリングする主要な方法(代わりにフィルタリングされたクエリを使用)としてではなく、ファセット/アグリゲーションが計算された後に結果をフィルタリングするためだけに使用することを示すようになりました。

http://www.elastic.co/guide/en/elasticsearch/reference/current/_search_requests.html