0
点赞
收藏
分享

微信扫一扫

ES中如何实现in和not in查询


问题描述:

在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语句查询。


举报

相关推荐

0 条评论