match_phrase_prefix查询不适用于嵌套聚合

时间:2019-08-06 21:04:36

标签: elasticsearch elasticsearch-dsl

我无法在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来处理嵌套字段的方法?还是在术语级别应用过滤器的方法?

2 个答案:

答案 0 :(得分:0)

使用嵌套的顶级查询解决了此问题。 有关有效的解决方案,请参见以下问题(使用terms而不是prefix过滤器):

Elasticsearch - How to filter nested aggregation bucket?

示例:

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

答案 1 :(得分:0)

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

此查询

  

“查询”:{           “ match_phrase_prefix”:{             “ field2.nestedField”:“ en”           }         }

不返回任何内容,因为您的索引文档不包含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"
            }
          }
        }
      }
    }
  }
}