使用elasticsearch-dsl-py在另一个字段中包含的字段上创建术语查询

时间:2014-11-19 17:57:22

标签: python elasticsearch

我正在使用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")

但我不能因为关键字不能包括点。

4 个答案:

答案 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)