如果 JSON 对象具有使用 DSL 的密钥,如何在 elasticsearch 中进行检查?

How to check in elasticsearch if a JSON object has a key using the DSL?

如果我在以下格式的索引中有两个文档,我只想清除那些具有空 JSON 而不是我预期的键的文档。

一个

{ 
  "search": { 
      "gold": [1,2,3,4]
}

B

{
  "search":{}
}

我应该只得到 A json 而不是 B json。

我已经尝试使用 exists 查询来搜索 "gold",但它只检查非空值和 returns 列表。 注意:以下不符合我的要求。

GET test/_search
{
  "query": {
    "bool": {
    "must": [
        { 
           "exists": { "field": "search.gold" }}
       ]
     }
   }
}

这是一个简单的问题,但即使在搜索了他们的文档后我也找不到解决方法。 如果有人能帮我做到这一点,那就太好了。

索引的简化映射为:

"test": {
    "mappings": {
    "carts": {
        "dynamic": "true",
        "_all": {
        "enabled": false
        },
        "properties": {
        "line_items": {
            "properties": {
            "line_items_dyn_arr": {
                "type": "nested",
                "properties": {
                "dynamic_key": {
                    "type": "keyword"
                }
                }
            }
            }
        }
        }
    }
    }
}

您是否在 search 字段中存储了完整的 json? 如果不是这种情况,请分享您的索引和示例数据的映射。

更新: 查询嵌套字段:

{
  "query": {
    "nested": {
      "path": "search",
      "query": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "search.gold"
              }
            }
          ]
        }
      }
    }
  }
}

对于嵌套类型字段,我们需要指定 pathquery 在嵌套字段上执行,因为嵌套字段被索引为子文档。

弹性文档:Nested Query

更新基于问题中添加的映射:

{
  "query": {
    "nested": {
      "path": "line_items.line_items_dyn_arr",
      "query": {
        "exists": {
          "field": "line_items.line_items_dyn_arr"
        }
      }
    }
  }
}

注意我们使用了 "path": "line_items.line_items_dyn_arr"。我们要求提供完整路径的原因是因为 nested 字段 line_items_dyn_arr 本身在 line_items 对象下。如果 line_items_dyn_arr 是映射的 属性,而不是 objectnested 字段的 属性,则先前的查询将正常工作。

Nishant 的回答是正确的,但出于某种原因,只有当路径和字段是整个路径时我才能让它工作。

以下适合我。

{
    "nested": {
        "path": "search.gold",
        "query": {
        "exists": {
            "field": "search.gold"
        }
        }
    }
}