【问题标题】:Elastic Search nested object queryElastic Search 嵌套对象查询
【发布时间】:2018-06-11 12:47:39
【问题描述】:

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

"_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'field,如果是value = "30-05-2018",它应该与上面的文档匹配。

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

【问题讨论】:

  • 这个答案可能会有所帮助:stackoverflow.com/questions/32267353/…
  • 感谢@Val,在上面的链接示例中 arr: [ { "f1" : "a" , f2 : true }, { "f1" : "b" , f2 : false} ],如何查询条件 f1=a,f2=true 和 f1=b,f2=false?
  • 我有同样的问题,它也解决了我的问题

标签: python elasticsearch


【解决方案1】:

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

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

【讨论】:

  • 酷,很高兴它有帮助!
  • 对于上面的文档结构,有没有其他方法可以查询而不是将其作为嵌套对象?因为我在同一个文档中有一些其他数据,它们不是嵌套对象。但是当我进行简单搜索时,它会跳过嵌套文档。
  • 您介意用您的新问题创建另一个问题吗?
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多