Elasticsearch DSL:过滤,然后聚合 python
Elasticsearch DSL: filter, then aggregate in python
我需要过滤 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} object has no attribute {!r}'.format(self.class.name, name))
AttributeError: 'Terms' object has no attribute 'execute'
我尝试切换过滤和聚合,尝试在最后做 execute()
,但没有帮助。如何实现这种简单的转换 - filtering + aggregation
?我找到了单独进行聚合或单独过滤的示例,但在一个查询中找不到这两者。
而不是
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()
首先添加过滤器,然后定义聚合,最后执行搜索。
我需要过滤 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} object has no attribute {!r}'.format(self.class.name, name)) AttributeError: 'Terms' object has no attribute 'execute'
我尝试切换过滤和聚合,尝试在最后做 execute()
,但没有帮助。如何实现这种简单的转换 - filtering + aggregation
?我找到了单独进行聚合或单独过滤的示例,但在一个查询中找不到这两者。
而不是
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()
首先添加过滤器,然后定义聚合,最后执行搜索。