首先,我注意到现在我写的内容实际上没有定义任何聚合。关于如何使用它的文档对我来说不是很易读。使用我上面写的内容,我将进行扩展。我正在更改索引名称以获得更好的示例。
from datetime import datetime
from elasticsearch_dsl import DocType, String, Date, Integer
from elasticsearch_dsl.connections import connections
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search, Q
client = connections.create_connection(hosts=['http://blahblahblah:9200'])
s = Search(using=client, index="airbnb", doc_type="sleep_overs")
s = s.execute()
s.aggs.bucket('by_house', 'terms', field='house_number', size=0)
我们将为每个门牌号创建一个存储桶。因此,存储桶的名称将是门牌号。ElasticSearch(ES)将始终给出符合该存储桶条件的文档计数。Size = 0表示要返回所有结果,因为ES的默认设置仅返回10个结果(或者您的开发人员设置了其他值)。
s = s.execute()
print s.aggregations.by_house.doc_count
print s.hits.total
print s.aggregations.by_house.buckets
for item in s.aggregations.by_house.buckets:
print item.doc_count
我之前的错误是认为Elastic Search查询默认具有聚合功能。实际上,你需要自己定义它们,然后执行它们。然后你的响应可以通过你提到的聚合器进行拆分。
上述内容的CURL应该如下所示:
注意:我使用的是SENSE,这是Google Chrome的一个ElasticSearch插件/扩展程序/附加组件。在SENSE中,你可以使用//来注释掉一些内容。
POST /airbnb/sleep_overs/_search
{
"size": 0,
"aggs": {
"by_house": {
"terms": {
"field": "house_number",
"size": 0
}
}
}
}
解决方法。DSL论坛上的某个人告诉我放弃翻译,直接使用这种方法。这样更简单,你只需要在CURL中编写困难的部分。这就是我称之为“解决方法”的原因。
client = connections.create_connection(hosts=['http://blahblahblah:9200'])
s = Search(using=client, index="airbnb", doc_type="sleep_overs")
body = {
"size": 0,
"aggs": {
"by_house": {
"terms": {
"field": "house_number",
"size": 0
}
}
}
}
s = Search.from_dict(body)
s = s.index("airbnb")
s = s.doc_type("sleepovers")
body = s.to_dict()
t = s.execute()
for item in t.aggregations.by_house.buckets:
print item.key, item.doc_count
希望这能帮到你。我现在使用CURL来设计所有内容,然后使用Python语句来分离结果以获取我想要的内容。这对于具有多个级别(子聚合)的聚合非常有帮助。