Elasticsearch DSL:过滤,然后在python

时间:2019-06-18 14:12:30

标签: python-2.7 elasticsearch elasticsearch-dsl

我需要过滤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:“条款”对象没有属性“执行”

我尝试切换过滤和聚合,最后尝试做execute(),但这无济于事。如何实现这种简单的转换-filtering + aggregation?我发现了分别进行聚合或分别进行过滤的示例,但是在一个查询中都找不到它们。

1 个答案:

答案 0 :(得分:1)

代替

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()

首先添加一个过滤器,然后定义聚合,最后执行搜索。