Elasticsearch DSL: фильтр, затем агрегирование в python - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно отфильтровать документы в индексе Elasticsearch и затем агрегировать их по полю.Вот код того, что я пытаюсь сделать:

import elasticsearch
from elasticsearch_dsl import Search, Q, Index, MultiSearch
es_client = elasticsearch.Elasticsearch([url],
        timeout=30, retry_on_timeout=True)
project_ids=['CSI'] 
family_ids=['SF6140691_WES_CIDR'] 
sample_ids=['S1379354_CIDR'] 
gene_symbols=['GLTPD1', 'CCNL2', 'MRPL20'] 

genes_filter = Q('bool', must=[Q('terms', project_id=project_ids),
                                   Q('terms', family_id=family_ids),
                                   Q('terms', sample_id=sample_ids),
                                   Q('terms', gene_symbol=gene_symbols)])
search = Search(using=es_client, index="GENES_DATA")
search = search.filter(genes_filter).execute()
results = search.aggs.bucket('by_family', 'terms', field='family_id', size=0)

В настоящее время я получаю следующую ошибку:

'{! R} объект не имеет атрибута {! R} '. format (self. class . name , name)) AttributeError: у объекта «Terms» нет атрибута «execute»

Я пыталсяпереключи фильтрацию и агрегацию, попробовал сделать execute() в самом конце, но это не помогает.Как достичь этого простого преобразования - filtering + aggregation?Я нашел примеры выполнения агрегации по отдельности или фильтрации по отдельности, но мне было трудно найти оба в одном запросе.

1 Ответ

1 голос
/ 19 июня 2019

вместо

search = search.filter(genes_filter)
results = search.aggs.bucket('by_family', 'terms', field='family_id', size=0)

вы должны иметь:

search = search.filter(genes_filter)
search.aggs.bucket('by_family', 'terms', field='family_id', size=0)
results = search.execute()

Сначала вы добавляете фильтр, затем определяете агрегаты и, наконец, выполняете свой поиск.

...