Можете ли вы запросить элементы между несколькими дочерними элементами в родительско-дочернем соединении в elasticsearch?

#elasticsearch #parent-child

#elasticsearch #родитель-потомок

Вопрос:

Можно ли сделать запрос среди дочерних элементов и вернуть родительский элемент? Итак, если один дочерний элемент имеет мужской пол и возраст 17 лет, а другой имеет женский пол и возраст 21. Возможно ли вернуть родителей тогда и только тогда, когда у них есть дочерний элемент мужского пола и дочерний элемент, возраст которого составляет 21 год?

Ответ №1:

Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "gender": {
        "type": "text"
      },
      "my_join_field": {
        "type": "join",
        "relations": {
          "parents": "children"
        }
      }
    }
  }
}
 

Индексировать данные:

Родительский документ —

 {
  "my_id": "1",
  "text": "This is parent 1",
  "my_join_field": {
    "name": "parents" 
  }
}
 

Дочерние документы —
Оба эти документа являются дочерними элементами одного и того же родителя

 {
  "my_id": "4",
  "age": 21,
  "gender": "female",
  "text": "This is second child",
  "my_join_field": {
    "name": "children",
    "parent": "1"
  }
}
{
  "my_id": "3",
  "age": 17,
  "gender": "male",
  "text": "This is first child",
  "my_join_field": {
    "name": "children",
    "parent": "1"
  }
}
 

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "children",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "gender": "male"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "has_child": {
            "type": "children",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "age": 21
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "65677365",
        "_type": "_doc",
        "_id": "1",
        "_score": 2.0,
        "_source": {
          "my_id": "1",
          "text": "This is parent 1",
          "my_join_field": {
            "name": "parents"
          }
        }
      }
    ]
 

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

1. @Aidan Tan у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂

2. @Aidan Tan если мой ответ помог вам решить вашу проблему, не могли бы вы принять и поддержать ответ 🙂

3. большое вам спасибо! Не могу поверить, что это вылетело у меня из головы.

4. @AidanTan рад, что это сработало для вас 🙂 Не могли бы вы, пожалуйста, также проголосовать за ответ 🙂