使用Elasticsearch dsl

时间:2019-02-06 02:31:49

标签: elasticsearch elasticsearch-dsl-py

使用ES 6.1,Python 3和elasticsearch-dsl,我得到了具有以下映射的文档:

"mappings": {
    "doc": {
        "properties": {
            "id": {"type": "text"},
            "prop_a": {"type": "text"},
            "prop_b": {
                "type": "nested",
                "include_in_root": "true",
                "properties": {
                    "title": {"type": "text"},
                    "prop_bx": {
                        "type": "nested",
                        "properties": {
                            "name": {"type": "text"}
                            "descr": {"type": "text"}
                        }
                    }

例如:

{
"id": "abc123",
"prop_a": "foo",
"prop_b": { 
    "title": "some title",
    "prop_bx": {
        "name": "some name"
        "descr": "lorem ipsum ipso facto"
    }
}}

并且我可以成功查询2级(prop_b)属性“ title”,例如:

s1=Search().using(client).query('nested', 
    path='prop_b', 
    query=Q('match', prop_b__title='some title'))

我已经尝试了很多方法来提升到下一个级别(prop_bx),而我最好的镜头是这个,但是它得到了“ 400无法创建查询”:

s2=Search().using(client).query('nested', 
        path='prop_b', 
        query=Q('nested',path='prop_b__propbx'),
            query=Q('match', prop_b__propbx__name='some name'))

在文档中找不到答案甚至线索。我可以用更详细的标准查询形式编写此代码,然后使用.from_dict()方法进行转换,但是为什么还要麻烦将其转换为elasticsearch-dsl?

线索?谢谢。

1 个答案:

答案 0 :(得分:2)

只需使用。而不是路径上的__:

S2=Search().using(client).query('nested', 
        path='prop_b.probbx', 
        query=Q('match', prop_b__propbx__name='some name'))