elasticsearch,Python,elasticsearch" /> elasticsearch,Python,elasticsearch" />

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

Python 使用elasticsearch dsl py在另一个字段中包含的字段上创建术语查询,python,elasticsearch,Python,elasticsearch,我正在使用并希望筛选包含在另一个术语中的术语,如下所示: "slug": { "foo": "foo-slug", "bar": "bar-slug " } 我所做的是: search.query(‘filtered’, filter={"term": {"slug.foo": "foo-slug"}}) 我想要像这样的东西 search.filter(term, slug.foo="foo-slug") 但我不能,因为关键字不能包含点。这将为您提供窍门: args = {

我正在使用并希望筛选包含在另一个术语中的术语,如下所示:

"slug": {
    "foo": "foo-slug",
    "bar": "bar-slug "
}
我所做的是:

search.query(‘filtered’, filter={"term": {"slug.foo": "foo-slug"}})
我想要像这样的东西

search.filter(term, slug.foo="foo-slug")

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

这将为您提供窍门:

args = {
    "slug.foo": "foo-slug"
}
search.filter(term, **args)

所以我假设slug是一个更大的文档中的一个。在当前版本(0.0.8)中,可以这样实现:

from elasticsearch_dsl import F

...

f = F('term', foo='foo-slug')
search = search.filter('nested', path='slug', filter=f)

如果这对其他人有帮助的话,我在使用嵌套对象对子属性而不是创建此类查询时也遇到了同样的问题。我发现解决方案是使用
query
方法而不是
filter
方法:

search.query('match', **{"slug.foo": "foo-slug"})

这在ElasticSearch 1.5.2中对我有效。

编辑。。。不要这样做:有关正确的方法,请参阅aaronfay的答案。

这似乎没有记录在任何地方,这是悲哀的

>>> search.filter('term', slug__foo='foo-slug').to_dict()
{'query': {'filtered': {'filter': {'term': {u'slug.foo': 'foo-slug'}}, 'query': {'match_all': {}}}}}

双下划线将转换为点表示法。不知道这是否稳定。

我根本不是Python专家,但是你不能使用
查询中的字典语法吗?就像在
search.filter(术语,{'slug.foo':'foo-slug'})
中一样?哦,我的天啊,谢谢!文档确实令人伤心。arronfay的回答是正确的方法,双下划线可能不应该使用,因为它可能在未来的版本中被破坏。