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
クエリでは、 filter
と must_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
クエリを持ってくることで、やりたいことは実現ができると言えばできるが、これがデファクトなのか、一番効率的な方法なのか、についての自信がなかったので、それについて調べてみたメモ。
回答
Elasticsearch: How to write an 'OR' clause in filter context?
I'm looking for syntax/example compatible with ES version is 6.7. I have seen the docs, I don't see any examples for this and the explanation isn't clear enough to me. I have tried writing query
stackoverflow.com

上記はまさしくこれについて質問しているスレッドだが、これによると、予想の通り bool
を二段に重ねるのが正しいらしい。
記述されているコードを抜粋すると、以下の通り。
{
"query":{
"bool":{
"filter":[{
"bool":{
"should":[
{ // Query 1 },
{ // Query 2 }
]
}
}]
}
}
}