Elasticsearch 检查对象中是否存在键

Elasticsearch check a key exists in an object

我对其中一个索引的部分映射:

{
  "title": { "type": "string"},
  "seasons": {
    "type": "object",
    "dynamic": true,
    "properties": {}
  }
}

目前我有4个文档如下:

文档 1

{
  "title": "abc",
  "seasons": null
}

文档 2

{
  "title": "xyz",
  "seasons": {
    "201809": 23,
    "201902": 45
  }
}

文档 3

{
  "title": "xyz",
  "seasons": {
    "201811": 23,
    "201910": 23,
    "201809": 45,
    "201805": 35,
  }
}

文档 4

{
  "title": "xyz",
  "seasons": {
    "201802": 23,
    "201902": 45
  }
}

seasons 对象将始终是 null 或将具有 key=>val 对。

我想搜索所有具有 season 字段且键为 201809 的文档(这里 doc2 和 doc3 符合条件),然后在文档上做进一步的工作。

要求 - 我需要 运行 此搜索仅使用 groovy 脚本。在我的 groovy 脚本中,我确实有:

if (doc["seasons.201809"].value) {
   ....more processing after finding the document.....
}

但是对于这次检查我得到 "TransportError(500, 'search_phase_execution_exception', 'no_class_def_found_error: java/lang/Throwable')"。 我确定这一行不是正确的检查

if (doc["seasons.201809"].value) {

谁能告诉我如何解决检查密钥是否存在的问题?

对于 Groovy 部分,您可以执行以下操作:

// (1) More verbose approach
if (doc.containsKey('seasons') && doc.seasons.containsKey('201802')) {
    println "Key seasons.201802 exists!"
}

或:

// (2) Shorter version
if (doc?.seasons?.containsKey('201802')) {
    println "Key seasons.201802 exists!"
}

这里是一些 Groovy 完整示例:

import groovy.json.JsonSlurper

String json = '''{
  "title": "xyz",
  "seasons": {
    "201802": 23,
    "201902": 45
  }
}'''

Map doc = new JsonSlurper().parseText(json)

// (1) More verbose approach
if (doc.containsKey('seasons') && doc.seasons.containsKey('201802')) {
    println "(1) Key seasons.201802 exists!"
}

// (2) Shorter version
if (doc?.seasons?.containsKey('201802')) {
    println "(2) Key seasons.201802 exists!"
}

输出

(1) Key seasons.201802 exists!
(2) Key seasons.201802 exists!