Эластичный поиск: возвращает подходящих родителей с подобранными / непревзойденными дочерними элементами

#elasticsearch #join #search #parent-child

#elasticsearch #Присоединиться #Поиск #родитель-потомок

Вопрос:

Я использую эластичный поиск 7.8.1 и использовал родительско-дочерний метод для индексации документов. Мое требование — выполнять поиск как в родительских, так и в дочерних документах, но возвращать ответ в формате, в котором родительский документ является основным документом, а дочерний документ — полем в родительском документе. т.е

 1) If the child matches, I wish to return parent amp; child in a document. I am able to achieve this using has_child and inner_hits.
2) If the parent matches the query, I wish to return parent and child in a document even if the child does not matches. (Not sure how to achieve this)

# This is the parent child relationship mapping in index
*curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "my_id": {
        "type": "keyword"
      },
      "my_join_field": { 
        "type": "join",
        "relations": {
          "question": "answer" 
        }
      }
    }
  }
}
'*
    
Below is the query I am trying to use, but it does not return the child when the parent matches:
*curl -X POST "localhost:9200/my-index-000001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "should": [
        {
          "has_child": {
            "type": "answer",
            "query": {
              "match": {
                "my_id": "4"
              }
            },
            "inner_hits": {
              "size": 1
            }
          }
        },
        {
          "match": {
            "my_id": "1"
          }
        }
      ]
    }
  }
}'*
  

#Родительские документы curl -X ПОМЕЩАЮТ «localhost: 9200/my-index-000001/_doc/1?refresh amp; pretty» -H ‘Content-Type: application/json’ -d’ { «my_id»: «1», «text»: «Это вопрос», «my_join_field»: «вопрос» } ‘ curl -X ПОМЕЩАЕТ «localhost: 9200/my-index-000001 / _doc/2?обновить и красиво» -H ‘Content-Type: application/json’ -d’ { «my_id»: «2», «text»: «Это другой вопрос», «my_join_field»: «вопрос» } ‘

#Дочерние документы curl -X ПОМЕЩАЮТ «localhost: 9200/my-index-000001/_doc/3?routing=1amp;refreshamp; pretty» -H ‘Content-Type: application/json’ -d’ { «my_id»: «3», «text»: «Это ответ», «my_join_field»: { «name»: «answer», «parent»: «1» } } ‘ curl — X ПОМЕСТИТЕ «localhost: 9200/my-index-000001/_doc/4?routing=1amp;refresh amp;pretty» -H ‘Тип содержимого: application/ json’ -d’ { «my_id»: «4», «text»: «Это другой ответ», «my_join_field»: { «name»: «ответ», «parent»: «1» } } ‘

Как я могу выполнить поиск как родительского, так и дочернего элементов, но вернуть дочерний элемент в виде поля в родительском документе. Заранее спасибо.

Комментарии:

1. Пожалуйста, используйте опцию редактирования в вашем вопросе, чтобы добавить информацию. Не используйте комментарии для этого.