在弹性搜索嵌套对象中应用多个过滤器

时间:2019-05-09 21:10:22

标签: elasticsearch

我正在尝试对嵌套对象应用多个过滤器,并且我只想返回在单个对象中具有所有匹配项的文档,而不是从多个对象中返回。

弹性搜索中的数据

D1 document
"fields":[
{
    "field_name": "test",
    "field_value": "test",
    "field_id": "123"
},
{
    "field_name": "test1",
    "field_value": "test1",
    "field_id": "1231"
},
{
    "field_name": "test2",
    "field_value": "test2",
    "field_id": "1232"
}]

D2 document
"fields":[
{
    "field_name": "test1",
    "field_value": "testda",
    "field_id": "123a"
},
{
    "field_name": "test1ad",
    "field_value": "test1",
    "field_id": "1231"
},
{
    "field_name": "test2a",
    "field_value": "test2a",
    "field_id": "1231"
}]

字段是具有文本和关键字映射的嵌套对象

"fields": {
            "type": "nested",
            "properties": {
              "field_id": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              },
              "field_name": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              },
              "field_value": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              }
            }
          }

这是我的弹性搜索查询

GET myindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "nested":{
          "path":"fields",
          "query":{
            "bool":{
              "must":{
                "bool":{
                  "must":[{
                    "match":{
                      "field_id.raw": "1231"
                    }
                  },
                  {
                    "match":{
                      "field_value.raw": "test1"
                    }
                  },
                  {
                    "match":{
                      "field_name.raw": "test1"
                    }
                  }]
                }
              }
            }
          }
        }
      }
    }
  }
}

我没有得到任何回应。 而且我只希望返回第一个文档,因为它在同一对象中具有匹配项,而不是在此处和那里也具有匹配项的文档2中。 预先感谢...

1 个答案:

答案 0 :(得分:0)

对于嵌套字段,必须使用完全限定的名称。因此,它应该是field_id.raw而不是fields.field_id.raw。其他字段也是如此。

所以您的查询应该是:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "fields.field_id.raw": "1231"
                    }
                  },
                  {
                    "match": {
                      "fields.field_value.raw": "test1"
                    }
                  },
                  {
                    "match": {
                      "fields.field_name.raw": "test1"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}