问题描述:
在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语句查询。