#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 рад, что это сработало для вас 🙂 Не могли бы вы, пожалуйста, также проголосовать за ответ 🙂