在嵌套类型上使用聚合查询嵌套类型会返回意外结果

时间:2018-01-08 18:24:05

标签: elasticsearch elasticsearch-5

我们正在使用elasticsearch 5.6.4。如ES documentation中所述,

  

聚合在查询范围的上下文中运行,任何过滤器   应用于查询也将应用于聚合。

现在,我拥有的是: 带映射的索引:

{
    "properties":{
        "asset":{
            "properties":{
                "customerId":{
                    "type":"long"
                }
            }
        },
        "software":{
            "type": "nested",
            "properties":{
                "id":{
                    "type":"long"
                },
                "name":{
                    "type":"text",
                     "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

我已经创建了几个文档来执行各种测试。文档在customerId上编入索引。我在所有10个文档中都有2个或更多软件。为了测试软件的聚合,我在多个文档中创建了具有相同ID的软件。例如我的软件ID为12,文档为clientId 1和2以及3。另外,带有customerId 2的Doc有两个软件,Id为12。

因此,在文档1,2和3中有4个ID为12的软件。 当运行此查询时,聚合结果仅包含customerId 1而非2和3的文档:

{
  "query" : {
    "term":{
        "asset.customerId":1
    }
  },
  "aggregations" : {
    "aggs" : {
      "nested" : {
        "path" : "software"
      },
      "aggregations" : {
        "software.id.agg" : {
          "terms" : {
            "field" : "software.id",
            "size" : 10,
            "min_doc_count" : 1,
            "shard_min_doc_count" : 0,
            "show_term_doc_count_error" : false,
            "order" : [
              {
                "_count" : "desc"
              },
              {
                "_term" : "asc"
              }
            ]
          }
        }
      }
    }
  }
}

但是当查询过滤器在嵌套类型(software.id)上运行时,聚合结果包括所有文档(1,2和3),因此也存在因查询而应该过滤掉的桶。 :

{
  "query" : {
    "nested" : {
            "query" : {
              "match_phrase_prefix" : {
                "software.id" : {
                  "query" : 12,
                  "slop" : 100,
                  "max_expansions" : 50,
                  "boost" : 1.0
                }
              }
            },
            "path" : "software",
            "ignore_unmapped" : false,
            "score_mode" : "none",
            "boost" : 1.0
          }
  },
  "aggregations" : {
    "aggs" : {
      "nested" : {
        "path" : "software"
      },
      "aggregations" : {
        "software.id.agg" : {
          "terms" : {
            "field" : "software.id",
            "size" : 10,
            "min_doc_count" : 1,
            "shard_min_doc_count" : 0,
            "show_term_doc_count_error" : false,
            "order" : [
              {
                "_count" : "desc"
              },
              {
                "_term" : "asc"
              }
            ]
          }
        }
      }
    }
  }
}

在嵌套类型上提供查询过滤器的正确方法是什么,以便在聚合中应用?

0 个答案:

没有答案