关于elasticsearch:ES数组类型字段搜索以及数组空值搜索

164次阅读

共计 808 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0