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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斗者_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值