要按术语聚合过滤Elasticsearch中的数据,可以使用聚合和过滤器的组合。以下是一个使用代码示例的解决方法:
首先,创建一个索引并插入一些数据:
from elasticsearch import Elasticsearch
# 创建 Elasticsearch 客户端
es = Elasticsearch()
# 创建索引
index_name = 'my_index'
es.indices.create(index=index_name)
# 插入数据
data = [
{'name': 'John', 'age': 25, 'city': 'New York'},
{'name': 'Alice', 'age': 30, 'city': 'London'},
{'name': 'Bob', 'age': 35, 'city': 'Paris'},
{'name': 'Alice', 'age': 40, 'city': 'New York'}
]
for i, doc in enumerate(data):
es.index(index=index_name, id=i+1, body=doc)
接下来,使用聚合和过滤器来按术语聚合过滤数据:
from elasticsearch_dsl import Search, Q
# 创建一个 DSL Search 对象
s = Search(using=es, index=index_name)
# 构建聚合查询
s.aggs.bucket('name_terms', 'terms', field='name.keyword')
# 添加过滤器
s = s.filter(Q('term', city='New York'))
# 执行搜索
response = s.execute()
# 获取聚合结果
buckets = response.aggregations.name_terms.buckets
# 打印每个术语的聚合结果
for bucket in buckets:
print(f'Term: {bucket.key}, Count: {bucket.doc_count}')
这个示例中,我们创建了一个DSL Search对象并添加了一个术语聚合查询。然后,我们使用过滤器来限制结果集只包含城市为"New York"的数据。最后,我们执行搜索并打印每个术语的聚合结果。
请注意,上述示例使用了elasticsearch-dsl库,这是一个方便的Elasticsearch高级客户端库,提供了更简洁和易于使用的API。
希望这个示例能帮到你!
下一篇:按数值变量基于分组进行随机抽样