问题描述:

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐