本篇是有一个问题引出的,在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脚本,脚本的语法这里不展开了,有兴趣的可以去了解下。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。