Проверка Elasticsearch ключ существует в объекте

Мое частичное отображение для одного из индексов:

{
  "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. И в моем отличном сценарии у меня есть:

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) {

Может кто-нибудь дать мне знать, как решить эту проблему проверки существования ключа?

1 ответ

Решение

Для части 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!
Другие вопросы по тегам