ES数组类型字段搜索以及数组空值搜索

本篇是有一个问题引出的,在ES中文论坛看到这个样一个问题:

es存储的某一个字段值为数组,现搜索的时候需要搜索出结果该字段值为空或包含某几个值的数据,该怎么写
例如: “job_type” : [“12”,“49”,“67”] 或者 “job_type” : [ ]
需要搜出job_type中包含49的或者为空的数据

这个问题其实涉及好几个相关的知识点。

  • ES对于数组类型的写入和查询是怎样的
  • 如何查询数组为空的记录

在ES中,没有专门的数组数据类型,但是默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型。不过ES要求数组类型的各个元素值的数据类型必须相同。比如,下面这种数组就就无法存入ES。

[ 10, "apple" ]

但是下面这几种就可以,

[ "apple", "orange" ]
[ 1, 2 ]

下面回到问题。看要求应该是需要关键字匹配,所以字段的mapping类型可以设置为keyword,然后查询使用term查询。

mapping如下:

PUT my_index
{
  "mappings": {
    "properties": {
      "job_type": {
        "type": "keyword"
      }
    }
  }
}

然后写入两条文档,第二条是空的。

PUT my_index/_doc/1
{
  "job_type": ["12", "49", "67"]
}

PUT my_index/_doc/2
{
  "job_type": []
}

查询包含49的记录,

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "job_type": {
            "value": "49"
          }
        }}
      ]
    }
  }
}

搜索空值,

POST my_index/_search
{
  "query": {
    "script": {
      "script": "doc['job_type'].getLength()==0"
    }
  }
}

搜索空值这里使用了painless脚本,脚本的语法这里不展开了,有兴趣的可以去了解下。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值