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

ltb*_*esh 3 python elasticsearch

我正在使用elasticsearch-dsl-py,并希望过滤包含在另一个内的术语,如下所示:

"slug": {
    "foo": "foo-slug",
    "bar": "bar-slug "
}
Run Code Online (Sandbox Code Playgroud)

我这样做是:

search.query(‘filtered’, filter={"term": {"slug.foo": "foo-slug"}})
Run Code Online (Sandbox Code Playgroud)

我更喜欢类似的东西

search.filter(term, slug.foo="foo-slug")
Run Code Online (Sandbox Code Playgroud)

但我不能作为关键字不能包括点.

aar*_*fay 8

如果它可以帮助其他任何人,我在针对使用嵌套对象的子属性创建此类查询时遇到了同样的问题.我发现解决方案是使用query方法而不是filter方法:

search.query('match', **{"slug.foo": "foo-slug"})
Run Code Online (Sandbox Code Playgroud)

这在ElasticSearch 1.5.2中适用于我.


Cha*_*les 7

编辑...请勿这样做:请参阅aaronfay的答案,了解正确的方法.

这似乎没有记录在任何悲伤的地方......

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

双下划线将转换为点符号.不知道这是否稳定.

  • 哦哦哦我的天啊谢谢!该文档确实令人悲伤。 (2认同)