Elasticsearch の filter context で OR 条件で検索する方法

Published: 2022/2/19


疑問

Elasticsearch のクエリは階層化されていくが、特に、 bool クエリなどの filter の下に配置されたサブクエリは、 filter context の下に実行され、 score の計算が省略されたり、実行結果がキャッシュされたりするなどして、基本的には query よりも効率的な実行が期待できる。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

そうすると、それを踏まえた上で、 filter context 的に、 OR 条件でどのように検索したら良いか、については自明ではなかった。 というのも、 bool クエリでは、 filtermust_not は filter context 条件で実行されるが、 OR 条件を表す should については、これは query context で実行されるとの記述がある。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

素直に考えていくと、 bool クエリを二段に重ねて、一団目で filter 指定のみを行い、その配下に should のみを持つ bool クエリを持ってくることで、やりたいことは実現ができると言えばできるが、これがデファクトなのか、一番効率的な方法なのか、についての自信がなかったので、それについて調べてみたメモ。

回答

上記はまさしくこれについて質問しているスレッドだが、これによると、予想の通り bool を二段に重ねるのが正しいらしい。 記述されているコードを抜粋すると、以下の通り。

{
   "query":{
      "bool":{
         "filter":[{
            "bool":{
               "should":[
                  {  // Query 1 },
                  {  // Query 2 }
               ]
            }
         }]
      }
   }
}

Tags: elasticsearch

関連記事

About

エンジニアです。 仕事では Xincere Residence を作っています。 このサイトは個人のブログであり、所属団体の意見等とは関係がありません。

Tags