我有以下ElasticSearch Mapping。 映射:
"cid": {
"type": "long"
},
"crankings": {
"type": "nested",
"properties": {
"rank": {
"type": "long"
},
"name": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
我正在尝试对嵌套字段(crankings.rank.raw)和cid上的基数进行聚合。
我正在形成以下聚合查询。 查询:
{
"size": 0,
"aggregations": {
"crankings": {
"nested": {
"path": "crankings"
},
"aggregations": {
"crankings": {
"terms": {
"field": "crankings.name.raw",
"size": 0
},
"aggregations": {
"cid": {
"cardinality": {
"field": "cid"
}
}
}
}
}
}
}
}
但结果是,我没有得到预期的输出。
结果:
"buckets": [
{
"key": "xxxxxxxx",
"doc_count": 3223,
"cid": {
"value": 0
}
},
{
"key": "yyyyyy",
"doc_count": 1212,
"cid": {
"value": 0
}
},
....
我得到的是cid = 0,这是不可取的。
让我知道如何对查询进行建模以获得预期结果。 ElasticSearch版本2.1.1
答案 0 :(得分:0)
我得到了我正在寻找的解决方案。这可以通过使用反向嵌套聚合来实现。
根据参考文献(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html), 应用嵌套聚合时,查询将针对嵌套文档运行。因此,要访问嵌套doc中的父文档的任何字段,可以使用反向嵌套聚合。
最终查询如下:
{
"size": 0,
"aggregations": {
"crankings": {
"nested": {
"path": "crankings"
},
"aggregations": {
"crankings": {
"terms": {
"field": "crankings.name.raw",
"size": 0
},
"aggregations": {
"internal_cardinality": {
"reverse_nested": { },
"aggregations": {
"cid": {
"cardinality": {
"field": "cid"
}
}
}
}
}
}
}
}
}
}
我得到的输出符合预期:
"buckets": [
{
"key": "xxxxxxxx",
"doc_count": 3223,
"internal_cardinality": {
"doc_count": 3223,
"cid": {
"value": 60
}
}
},
{
"key": "yyyyyy",
"doc_count": 1212,
"internal_cardinality": {
"doc_count": 1212,
"cid": {
"value": 50
}
}
},
....