use*_*046 5 python elasticsearch elasticsearch-dsl
我想通过嵌套对象进行过滤来构建过滤后的Elasticsearch查询,并进行聚合以获取嵌套对象列表中嵌套对象的最小值。
过滤部分有效,但我无法将其与aggs(聚合)部分绑定。当我将.aggs.bucket部分添加到过滤器之后的代码中时,它要么被忽略(在中不可见search.to_dict()),要么给我语法错误。
谁能给我一个如何将它们捆绑在一起的例子吗?我正在尝试使两个过滤的查询结果都nested1.foo.bar在一个响应中结束计算的最小值
模式示例:
class MyExample(DocType):
myexample_id = Integer()
nested1 = Nested(
properties={
'timestamp': Date(),
'foo': Nested(
properties={
'bar': Float(),
}
)
}
)
nested2 = Nested(
multi=False,
properties={
'x': String(),
'y': String(),
}
)
Run Code Online (Sandbox Code Playgroud)
建立查询:
from elasticsearch_dsl import Search, Q
search = Search().filter(
'nested', path='nested1', inner_hits={},
query=Q(
'range', **{
'nested1.timestamp': {
'gte': exampleDate1,
'lte': exampleDate2
}
}
)
).filter(
'nested', path='nested2', inner_hits={'name': 'x'},
query=Q(
'term', **{
'nested2.x': x
}
)
).filter(
'nested', path='nested2', inner_hits={'name': 'y'},
query=Q(
'term', **{
'nested2.y': y
}
)
)
Run Code Online (Sandbox Code Playgroud)
基本上,我需要做的是获取每个唯一MyExample文档的所有嵌套nested1.foo.bar值的最小值(它们具有唯一的myexample_id字段)
添加
search.aggs\
.bucket('nested1', 'nested', path='nested1')\
.bucket('nested_foo', 'nested', path='nested1.foo')\
.metric('min_bar', 'min', field='nested1.foo.bar')
Run Code Online (Sandbox Code Playgroud)
下一行应该可以解决问题。