如何在elasticsearch中对多值字段进行桶聚合
How to do bucket aggregation on multi value field in elasticsearch
假设我的 elasticsearch 索引中的每个文档都是一个博客 post,它只包含两个字段,标题和标签。 title 字段只是一个字符串,而 tags 是一个多值字段。
如果我有三个这样的文件:
title tags
"blog1" [A,B,C]
"blog2" [A,B]
"blog3" [B,C]
我想按所有可能标签的唯一值进行存储,但我怎样才能得到如下所示的结果,其中包含存储桶中的三个项目。或者有什么有效的替代方法吗?
{A: ["blog1", "blog2"]}
{B: ["blog1", "blog2", "blog3"]}
{C: ["blog1", "blog3"]}
如果有人能在elasticsearch中提供答案就好了python API.
您可以简单地在 tags
字段上使用 terms
聚合和另一个嵌套 top_hits
sub-aggregation。通过以下查询,您将获得预期的结果。
{
"size": 0,
"aggs": {
"tags": {
"terms": {
"field": "tags"
},
"aggs": {
"top_titles": {
"top_hits": {
"_source": ["title"]
}
}
}
}
}
}
将此与 Python 一起使用非常简单:
from elasticsearch import Elasticsearch
client = Elasticsearch()
response = client.search(
index="my-index",
body= {
"size": 0,
"aggs": {
"tags": {
"terms": {
"field": "tags"
},
"aggs": {
"top_titles": {
"top_hits": {
"_source": ["title"]
}
}
}
}
}
}
)
# parse the tags
for tag in response['aggregations']['tags']['buckets']:
tag = tag['key'] # => A, B, C
# parse the titles for the tag
for hit in tag['top_titles']['hits']['hits']:
title = hit['_source']['title'] # => blog1, blog2, ...
假设我的 elasticsearch 索引中的每个文档都是一个博客 post,它只包含两个字段,标题和标签。 title 字段只是一个字符串,而 tags 是一个多值字段。
如果我有三个这样的文件:
title tags
"blog1" [A,B,C]
"blog2" [A,B]
"blog3" [B,C]
我想按所有可能标签的唯一值进行存储,但我怎样才能得到如下所示的结果,其中包含存储桶中的三个项目。或者有什么有效的替代方法吗?
{A: ["blog1", "blog2"]}
{B: ["blog1", "blog2", "blog3"]}
{C: ["blog1", "blog3"]}
如果有人能在elasticsearch中提供答案就好了python API.
您可以简单地在 tags
字段上使用 terms
聚合和另一个嵌套 top_hits
sub-aggregation。通过以下查询,您将获得预期的结果。
{
"size": 0,
"aggs": {
"tags": {
"terms": {
"field": "tags"
},
"aggs": {
"top_titles": {
"top_hits": {
"_source": ["title"]
}
}
}
}
}
}
将此与 Python 一起使用非常简单:
from elasticsearch import Elasticsearch
client = Elasticsearch()
response = client.search(
index="my-index",
body= {
"size": 0,
"aggs": {
"tags": {
"terms": {
"field": "tags"
},
"aggs": {
"top_titles": {
"top_hits": {
"_source": ["title"]
}
}
}
}
}
}
)
# parse the tags
for tag in response['aggregations']['tags']['buckets']:
tag = tag['key'] # => A, B, C
# parse the titles for the tag
for hit in tag['top_titles']['hits']['hits']:
title = hit['_source']['title'] # => blog1, blog2, ...