问题描述:
在ES中如何实现in和not in查询?
实现方案:
ES中可以通过terms进行多值匹配查询,实现in和not in查询逻辑。
比如:
"query": { "terms": { "name": [ "老万", "小明" ] } }
实战演示:
1、数据准备
创建订单索引order_index,并添加测试数据。
## 删除索引 ## DELETE order_index ## 新建索引 PUT order_index { "mappings": { "properties": { "name": { "type": "keyword" }, "amount": { "type": "integer" } } } } ## 添加数据 POST order_index/_bulk?refresh { "create": { } } { "name": "老万", "amount": 100} { "create": { } } { "name": "老万", "amount": 80} { "create": { } } { "name": "老万", "amount": 300} { "create": { } } { "name": "老王", "amount": 45} { "create": { } } { "name": "小明", "amount": 15} { "create": { } } { "name": "小明", "amount": 50} { "create": { } } { "name": "小红", "amount": 300}
2、实现IN查询
说明:查询姓名为老万和小明的订单记录。
GET order_index/_search { "query": { "terms": { "name": [ "老万", "小明" ] } } }
3、实现NOT IN查询
说明:通过bool查询,结合must_not和terms实现not in查询。
GET order_index/_search { "query": { "bool": { "must_not": [ { "terms": { "name": [ "老万", "小明" ] } } ] } } }
4、通过SQL查询实现
## in查询 POST /_sql?format=txt { "query": "SELECT name FROM order_index where name in ('老万','小明') " } ## not in查询 POST /_sql?format=txt { "query": "SELECT name FROM order_index where name not in ('老万','小明') " } ## 将not in查询sql语句转为dsl语句 POST /_sql/translate { "query": "SELECT name FROM order_index where name not in ('老万','小明') " }
总结
本文主要介绍ES中通过terms进行多值匹配查询实现in和not in查询逻辑。
当然,如果你对DSL查询语句不熟悉,现在ES中也支持直接采用SQL语句查询。