Трехуровневые вложенные логические запросы с elasticsearch dsl

Используя 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), например:

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?

Подсказки? Спасибо.


person kgeo    schedule 06.02.2019    source источник


Ответы (1)


Просто используйте. вместо __ в пути:

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