match_phrase_prefix 查询不适用于嵌套聚合

match_phrase_prefix query not working with nested aggregation

我无法在 Elasticsearch v6.8.0

中使用 match_phrase_prefix 限制嵌套聚合查询的结果

我可以使用 match_phrase_prefix 限制非嵌套聚合的结果。我希望能够将相同的逻辑应用于嵌套字段,如下所示。索引映射正确地将嵌套字段类型列为嵌套,并且我能够在没有任何过滤器的情况下成功聚合字段(使用 match_all)。

成功 非嵌套字段聚合 match_phrase_prefix 查询:

GET index/_search
{
  "query":{
    "match_phrase_prefix": {
      "field1": "Nurse"
    }
  },
  "size":0,
  "aggs":{
    "field1":{
      "terms":{
        "field":"field1",
        "size":100,
        "order":{
          "_count": "desc"
        }
      }
    }
  }
}

成功嵌套字段聚合(无match_phrase_prefix):

GET index/_search
{
  "query":{
    "match_all": {}
  },
  "size":0,
  "aggs":{
    "field2":{
      "nested":{
        "path":"field2"
      },
      "aggs":{
        "field2.nestedField":{
           "terms":{
              "field":"field2.nestedField",
              "size":100,
              "order":{
                "_count": "desc"
              }
            }
          }
        }
      }
    }
  }

不成功 嵌套字段聚合 match_phrase_prefix:

GET index/_search
{
  "query":{
    "match_phrase_prefix": {
      "field2.nestedField": "en"
    }
  },
  "size":0,
  "aggs":{
    "field2":{
      "nested":{
        "path":"field2"
      },
      "aggs":{
        "field2.nestedField":{
           "terms":{
              "field":"field2.nestedField",
              "size":100,
              "order":{
                "_count": "desc"
              }
            }
          }
        }
      }
    }
  }

第三个查询的预期输出是键与前缀过滤器匹配的桶列表。相反,我看到一个空的结果列表。有没有一种方法可以构造 match_phrase_prefix 来处理嵌套字段?或者在术语级别应用过滤器的方法?

使用嵌套顶级查询解决了这个问题。 请参阅此问题以了解工作解决方案(使用 terms 而不是 prefix 过滤器):

示例:

GET index/_search
{  
  "query":{  
    "nested":{  
      "path":"field2",
      "query":{  
        "match_phrase_prefix":{  
          "field2.nestedField":"en"
        }
      }
    }
  },
  "size":0,
  "aggs":{  
    "field2":{  
      "nested":{  
        "path":"field2"
      },
      "aggs":{  
        "innerFilter":{  
          "filter":{  
            "prefix":{  
              "field2.nestedField":"en"
            }
          },
          "aggs":{  
            "field2.nestedField":{  
              "terms":{  
                "field":"field2.nestedField",
                "size":100,
                "order":{  
                  "_count":"desc"
                }
              }
            }
          }
        }
      }
    }
  }
}

您需要为此使用嵌套查询(文档 here

这个查询

"query":{ "match_phrase_prefix": { "field2.nestedField": "en" } }

return 没有,因为您的索引文档不包含 nestedField 字段。该字段属于嵌套文档。

正确的查询是:

GET index/_search
{
  "query": {
    "nested": {
      "path": "field2",
      "query": {
        "match_phrase_prefix": {
          "field2.nestedField": "en"
        }
      }
    }
  },
  "size": 0,
  "aggs": {
    "field2": {
      "nested": {
        "path": "field2"
      },
      "aggs": {
        "field2.nestedField": {
          "terms": {
            "field": "field2.nestedField",
            "size": 100,
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  }
}