【问题标题】:match_phrase_prefix query not working with nested aggregationmatch_phrase_prefix 查询不适用于嵌套聚合
【发布时间】:2019-08-07 22:49:37
【问题描述】:

我无法在 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 以使用嵌套字段?或者在术语级别应用过滤器的方法?

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

    您需要为此使用嵌套查询(文档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"
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用嵌套的顶级查询解决了这个问题。 请参阅此问题以了解工作解决方案(使用 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"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        相关资源
        最近更新 更多