我正在使用elasticsearch-dsl-py,并希望过滤其中包含的术语,如下所示:
"slug": {
"foo": "foo-slug",
"bar": "bar-slug "
}
我的工作是:
search.query(‘filtered’, filter={"term": {"slug.foo": "foo-slug"}})
我更喜欢像
这样的东西search.filter(term, slug.foo="foo-slug")
但我不能因为关键字不能包括点。
答案 0 :(得分:7)
如果它对其他人有帮助,我在使用嵌套对象对子属性不创建此类查询时遇到了同样的问题。我发现解决方案是使用query
方法而不是filter
方法:
search.query('match', **{"slug.foo": "foo-slug"})
这在ElasticSearch 1.5.2中对我有用。
答案 1 :(得分:7)
编辑......请勿这样做:请参阅aaronfay对正确方法的回答。
这似乎没有记录在任何可悲的地方......
>>> search.filter('term', slug__foo='foo-slug').to_dict()
{'query': {'filtered': {'filter': {'term': {u'slug.foo': 'foo-slug'}}, 'query': {'match_all': {}}}}}
双下划线将转换为点符号。不知道这是否稳定。
答案 2 :(得分:0)
所以我假设slug在较大的文档中是nested object。在当前版本(0.0.8)中,可以这样实现:
<div id="test"></div>
答案 3 :(得分:-1)
这将为您解决问题:
args = {
"slug.foo": "foo-slug"
}
search.filter(term, **args)