如何使用DSL在Elasticsearch中检查JSON对象是否具有密钥?

时间:2018-11-23 13:05:50

标签: json elasticsearch dsl

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

A

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

B

{
  "search":{}
}

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

我已经尝试过使用现存查询来搜索“ gold”,但是它只是检查非null值并返回列表。 注意:以下内容无法满足我的要求。

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"
                }
                }
            }
            }
        }
        }
    }
    }
}

2 个答案:

答案 0 :(得分:1)

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

更新:查询嵌套字段:

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

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

弹性文档: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字段的属性,则上一个查询可以正常工作。

答案 1 :(得分:0)

Nishant的答案是正确的,但是由于某些原因,只有当路径和字段是完整路径时,我才能使它起作用。

以下对我有用。

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