Elasticsearch查询中组合OR、AND、IN运算符的实现方案
你要实现的SQL逻辑可以通过嵌套bool查询完成,外层should对应OR逻辑,每个OR分支内部用bool->must实现AND逻辑,IN运算直接使用ES的terms查询即可,完整PHP查询代码如下:
'query' => [ 'bool' => [ 'should' => [ // 对应 (field_1 = 'foo' AND field_2 IN(1,2,3)) [ 'bool' => [ 'must' => [ [ 'match' => [ 'field_1' => 'foo' ] ], [ 'terms' => [ 'field_2' => [1, 2, 3] ] ] ] ] ], // 对应 (field_1 = 'bar' AND field_2 IN(2,3,4)) [ 'bool' => [ 'must' => [ [ 'match' => [ 'field_1' => 'bar' ] ], [ 'terms' => [ 'field_2' => [2, 3, 4] ] ] ] ] ] ], // 强制至少匹配一个should条件,避免返回全量数据 'minimum_should_match' => 1 ] ]
逻辑对应说明:
bool->should:对应SQL的OR运算符,子句满足任意一个即可命中bool->must:对应SQL的AND运算符,子句必须全部满足才可命中terms查询:对应SQL的IN运算符,匹配字段值在指定数组内的文档
注意事项:
- 如果
field_1存储的是精确值(字段类型为keyword),可以把match替换为term查询,性能更优 terms查询仅支持精确值匹配,请确保field_2为数值或keyword类型,不要用text类型字段做terms查询
内容的提问来源于stack exchange,提问作者mkas
相关产品推荐
相关产品推荐

