Prima di tutto. Ora noto che ciò che ho scritto qui, in realtà, non ha definito alcuna aggregazione. La documentazione su come usare questo non è molto leggibile per me. Usando quello che ho scritto sopra, mi espanderò. Sto cambiando il nome dell'indice per fare un esempio migliore.
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
# Define a default Elasticsearch client
client = connections.create_connection(hosts=['http://blahblahblah:9200'])
s = Search(using=client, index="airbnb", doc_type="sleep_overs")
s = s.execute()
# invalid! You haven't defined an aggregation.
#for tag in s.aggregations.per_tag.buckets:
# print (tag.key)
# Lets make an aggregation
# 'by_house' is a name you choose, 'terms' is a keyword for the type of aggregator
# 'field' is also a keyword, and 'house_number' is a field in our ES index
s.aggs.bucket('by_house', 'terms', field='house_number', size=0)
Sopra stiamo creando 1 secchio per numero civico. Pertanto, il nome del bucket sarà il numero civico. ElasticSearch (ES) fornirà sempre un conteggio documenti dei documenti che si adattano a quel bucket. Size = 0 significa dare tutti i risultati, dato che ES ha un'impostazione predefinita per restituire solo 10 risultati (o qualsiasi cosa il tuo dev lo abbia impostato per fare).
# This runs the query.
s = s.execute()
# let's see what's in our results
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
L'errore precedente era pensare che una query di ricerca elastica avesse aggregazioni per impostazione predefinita. Li definisci tu stesso, poi li esegui. Quindi la tua risposta può essere divisa dagli aggregatori che hai citato.
Il CURL per quanto sopra deve avere il seguente aspetto:
NOTA: uso SENSE un plug-in/estensione/add-on ElasticSearch per Google Chrome. In SENSE puoi usare // per commentare le cose.
In giro. Qualcuno al GIT di DSL mi ha detto di dimenticare la traduzione e di usare solo questo metodo. È più semplice e puoi scrivere le cose difficili in CURL. Ecco perché lo chiamo un work-around.
# Define a default Elasticsearch client
client = connections.create_connection(hosts=['http://blahblahblah:9200'])
s = Search(using=client, index="airbnb", doc_type="sleep_overs")
# how simple we just past CURL code here
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:
# item.key will the house number
print item.key, item.doc_count
Spero che questo aiuti. Ora disegno tutto in CURL, quindi uso l'istruzione Python per staccare i risultati per ottenere ciò che voglio. Ciò aiuta le aggregazioni con più livelli (sotto-aggregazioni).
Posso chiederti se sei riuscito a rispondere alle tue domande oppure no? Sto affrontando esattamente gli stessi problemi ora - non so come fare l'aggregazione dei conteggi in elasticsearch-dsl – Jacobian
Sì. Da allora ho ostacolato alcuni ostacoli. Con l'aiuto dei programmatori di dsl, sto usando quello che considero un work-around per farlo in Python. Sfortunatamente, non ho avuto il tempo di usare questo modo puramente DSL, ma invece ho utilizzato to_dict. Proverò a incollare un buon esempio. – VISQL