弹性搜索嵌套对象查询

时间:2018-06-11 12:47:39

标签: python elasticsearch

我有一个弹性搜索索引集合,如下所示,

"_index":"test",
"_type":"abc",
"_source":{
       "file_name":"xyz.ex"
       "metadata":{
          "format":".ex"
          "profile":[
                     {"date_value" : "2018-05-30T00:00:00",
                     "key_id" : "1",
                     "type" : "date",
                     "value" : [ "30-05-2018" ]
                      },
                      {
                       "key_id" : "2",
                       "type" : "freetext",
                       "value" : [ "New york" ]
                       }
}

现在我需要通过将key_id与其值匹配来搜索文档。 (key_id是某个字段,其值存储在"value")中 防爆。对于key_id='1'字段,如果它是value = "30-05-2018",则应与上述文档匹配。

我尝试将其映射为嵌套对象,但我无法使用与其各自值匹配的2个或更多key_id来搜索查询。

1 个答案:

答案 0 :(得分:1)

我就是这样做的。您需要通过bool/filter(或bool/must)两个嵌套查询为每个条件对进行AND,因为您希望匹配同一父文档中的两个不同的嵌套元素。

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "metadata.profile",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "metadata.profile.f1": "a"
                    }
                  },
                  {
                    "term": {
                      "metadata.profile.f2": true
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "metadata.profile",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "metadata.profile.f1": "b"
                    }
                  },
                  {
                    "term": {
                      "metadata.profile.f2": false
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}