本篇是有一个问题引出的,在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脚本,脚本的语法这里不开展了,有趣味的能够去理解下。