想象两个文档:
[
{
"_id": "abc",
"categories": {
"category-id-1": 1,
"category-id-2": 50
}
},
{
"_id": "def",
"categories": {
"category-id-1": 2
}
}
]
如您所见,通过在categories
字段中设置嵌套字段,可以将每个文档与许多类别相关联。
通过这种映射,我应该能够从已定义的类别中请求文档,并通过设置为该字段值的值对它们进行排序。
我的问题是我现在想进行汇总以针对每个类别计算文档数。这将为我提供的数据集提供以下结果:
{
"aggregations": {
"categories" : {
"buckets": [
{
"key": "category-id-1",
"doc_count": 2
},
{
"key": "category-id-2",
"doc_count": 1
}
]
}
}
}
我在文档中找不到任何解决此问题的方法。我是ElasticSearch的新手,所以我可能在文档研究或映射选择方面做错了事情。
是否可以通过我的映射进行这种聚合?我正在使用ES 6.x
编辑:这是索引的映射:
{
"test1234": {
"mappings": {
"_doc": {
"properties": {
"categories": {
"properties": {
"category-id-1": {
"type": "long"
},
"category-id-2": {
"type": "long"
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
最直接的解决方案是使用一个新字段,其中包含文档的所有不同类别。
如果我们将此字段称为categories_list
,则可能是一种解决方案:
将映射更改为
{
"test1234": {
"mappings": {
"_doc": {
"properties": {
"categories": {
"properties": {
"category-id-1": {
"type": "long"
},
"category-id-2": {
"type": "long"
}
}
},
"categories_list": {
"type": "keyword"
}
}
}
}
}
}
然后,您需要像这样修改文档:
[
{
"_id": "abc",
"categories": {
"category-id-1": 1,
"category-id-2": 50
},
"categories_list": ["category-id-1", "category-id-2"]
},
{
"_id": "def",
"categories": {
"category-id-1": 2
},
"categories_list": ["category-id-1"]
}
]
则您的汇总请求应为
{
"aggs": {
"categories": {
"terms": {
"field": "categories_list",
"size": 10
}
}
}
}
并将返回
"aggregations": {
"categories": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "category-id-1",
"doc_count": 2
},
{
"key": "category-id-2",
"doc_count": 1
}
]
}
}