Поиск родителя и всех его дочерних элементов одним запросом в эластичном поиске

Ссылаясь на приведенные в официальной документации примеры построения отношений родитель-потомок - https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html

Ссылка предоставила отношение соединения вопрос-ответ, где вопрос является родительским, а ответ - дочерним типом.

Если вам нужно найти всех родителей, соответствующих некоторому тексту, а также их дочерние элементы, соответствующие тексту, специфичному для детей, в одном запросе, как бы вы это сделали?

Допустим, у них есть пары ключ-значение в документе json, как показано ниже, и мы ищем родителей, соответствующих тексту в вопросе, и детей, соответствующих значению в тексте ответа.

Parent --> question --> "question-text" : "Geography: Where is Mt. Everest?"
Child --> answer --> "answer-text" : "Nepal?"

Нам нужны не только родители или только дети, но и все родители со связанными с ними детьми, которые соответствуют запросу.

Я знаю, что внутренние обращения - это вариант, но не могу понять использование - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html

Надеюсь, вопрос ясен, при необходимости могу поподробнее.

Я также пробовал пример, упомянутый здесь, для внутренних обращений родитель-потомок:

Пример:

POST test_index/_search
    {
      "query": {
        "has_child": {
          "type": "child",
          "query": {
            "match": {
              "number": 2
            }
          },
          "inner_hits": {}    
        }
      }
    }

Это дает мне подходящих детей всех родителей. Как мне добавить фильтр к родительскому элементу и запросить только определенных родителей в том же запросе (вместе с дочерним фильтром)? Можно ли фильтровать родительские записи по определенному полю в одном запросе?

Что-то вроде этого -

POST test_index/_search
    {
      "query": {
        <match parents first on number:1 and then match the children below>
        "has_child": {
          "type": "child",
          "query": {
            "match": {
              "number": 2
            }
          },
          "inner_hits": {}    
        }
      }
    }

person Righto    schedule 07.03.2018    source источник


Ответы (1)


Это сработало для меня. Единственным недостатком является то, что панель инструментов kibana Discover не поддерживает has_child или has_parent, и поэтому мы не можем создавать визуализации.

POST test_index/_search
{
    "query": {
        "bool": {
            "must": [{
                "has_child": {
                    "type": "childname",
                    "query": {
                        "match": {
                            "properties.name": "hello"
                        }
                    },
                     "inner_hits": {}    
                }
            },
            {
                "match": {
                    "account.name": "random",
                    "version": {"2.0"}
                }
            },{
                "match": {
                    "account.name": "random",
                    "version": {"2.0"}
                }
            ]
        }
    }
}
person Righto    schedule 08.03.2018