我们正在使用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"
}
]
}
}
}
}
}
}
在嵌套类型上提供查询过滤器的正确方法是什么,以便在聚合中应用?