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!
我对其中一个索引的部分映射:
{
"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!