2017-01-17 1 views
0

J'essaie d'utiliser la bibliothèque elasticsearch-dsl, mais malheureusement ce n'est pas bien documenté.elasticsearch-dsl - Agrégats collectant la moyenne en python

J'ai le filtre suivant, qui fonctionne.

D'abord, je trouve à quelle distance j'ai besoin de ma recherche.

longtime = datetime.datetime.strptime(str(datetime.datetime.now() - datetime.timedelta(seconds=int(pairs[p][1]) + basehrs)), '%Y-%m-%d %H:%M:%S.%f').strftime('%s.%f') 

Je gère ma recherche avec un filtre

s = Search(using=es, index="history", doc_type=pairs[p][0]).filter('range', timestamp={'gte': longtime}) 

Après cela, je devrais besoin d'exécuter quelques aggs. Je les éléments suivants, mais il ne fonctionne pas:

s = s.aggs.bucket('average', 'avg', field='ask') 

Il revient juste de retour:

Avg (champ = « demander »)

Je dois aussi faire un calcul amusant, non juste quelque chose de simple. Je dois demander à + (propagation/2)

-à-dire

s = s.aggs.bucket ('moyenne', 'Avg', champ = '+ demander (propagation/2')

Est-ce

Alors que nous sommes ici, j'ai besoin de propagation pour être un type entier, c'est actuellement une chaîne.J'ai utilisé python pour créer l'index en premier lieu, je suis heureux de supprimer mon index et recommencez, mais je ne sais pas comment spécifier le type de champ en python quand il est créé

Répondre

0

agrégations que vous ne devez pas renvoyer à s, les agrégations sont modifiées sur place.

Pour l'agrégation scénarisé, vous devez spécifier un script [0] (et le script activé dans ElasticSearch):

s.aggs.metric('average', 'avg', script={'inline': "doc['ask'].value + doc['spread'].value/2"}) 

0 - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-avg-aggregation.html#_script

+0

Salut mec, j'apprécie l'aide. Je joue avec ça depuis quelques heures maintenant et je n'arrive pas à le faire fonctionner. J'obtiens: '{'query': {'bool': {'filter': [{'range': {'timestamp': {'gt': '1484749397.311207'}}}]}}, ' aggs ': {' average ': {' avg ': {' script ': {' inline ':' doc ["ask"]. value + doc ["spread"]. value/2 '}}}},' sort_keys ': True,' size ': 50000} ' retourné lorsque j'imprime le dict. –

+0

oh, s'il vous plaît juste passer dans les datetime, pas besoin de les sérialiser en timestamps. Si vous les sérialisez, assurez-vous qu'ils sont compatibles avec elasticsearch qui utilise une précision en millisecondes ('timestamp * 1000' en python). –

0

après vous s = s.aggs.bucket('average', 'avg', field='ask')

do result = s.execute()

alors votre result.aggs.to_dict() vous montrera le résultat agg