Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL ›Объединяющие запросы

Запрос Has child

Возвращает родительские документы, чьи связанные дочерние документы соответствуют предоставленному запросу. Вы можете создать родительско-дочерние отношения между документами в одном индексе с помощью отображения поля join.

Поскольку он выполняет объединение, has_child медленнее по сравнению с другими запросами. Его производительность ухудшается по мере увеличения числа совпадающих дочерних документов, указывающих на уникальные родительские документы. Каждый has_child запрос в поиске может значительно увеличить время выполнения запроса.

Если вам важна производительность запросов, не используйте этот запрос. Если вам необходимо использовать запрос has_child, используйте его как можно реже.

Пример запроса

Настройка индекса

Чтобы использовать запрос has_child, ваш индекс должен включать отображение поля join. Например:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "my-join-field": {
                "type": "join",
                "relations": {
                    "parent": "child"
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        "my-join-field": {
          type: 'join',
          relations: {
            parent: 'child'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      "my-join-field": {
        type: "join",
        relations: {
          parent: "child",
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "my-join-field": {
        "type": "join",
        "relations": {
          "parent": "child"
        }
      }
    }
  }
}

Пример запроса

resp = client.search(
    query={
        "has_child": {
            "type": "child",
            "query": {
                "match_all": {}
            },
            "max_children": 10,
            "min_children": 2,
            "score_mode": "min"
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    has_child: {
      type: "child",
      query: {
        match_all: {},
      },
      max_children: 10,
      min_children: 2,
      score_mode: "min",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "has_child": {
      "type": "child",
      "query": {
        "match_all": {}
      },
      "max_children": 10,
      "min_children": 2,
      "score_mode": "min"
    }
  }
}

Параметры верхнего уровня для has_child

type
(Обязательно, строка) Имя отображения дочерних отношений для поля join.
query
(Обязательно, объект запроса) Запрос, который вы хотите выполнить на дочерних документах поля type. Если дочерний документ соответствует поиску, запрос возвращает родительский документ.
ignore_unmapped

(Необязательно, булево) Указывает, нужно ли игнорировать неопределенное поле type и не возвращать документы, а возвращать ошибку. По умолчанию false.

Если false, Elasticsearch возвращает ошибку, если поле type не определено.

Вы можете использовать этот параметр для запроса к нескольким индексам, которые могут не содержать поле type.

max_children
(Необязательно, целое число) Максимальное количество дочерних документов, соответствующих query, разрешенных для возвращаемого родительского документа. Если родительский документ превышает это ограничение, он исключается из результатов поиска.
min_children
(Необязательно, целое число) Минимальное количество дочерних документов, соответствующих query, необходимое для соответствия запросу для возвращаемого родительского документа. Если родительский документ не соответствует этому ограничению, он исключается из результатов поиска.
score_mode

(Необязательно, строка) Указывает, как оценки соответствия дочерних документов влияют на релевантность родительского документа оценку релевантности. Допустимые значения:

none (По умолчанию)
Не используйте оценки релевантности соответствующих дочерних документов. Запрос присваивает родительским документам оценку 0.
avg
Используйте среднюю оценку релевантности всех соответствующих дочерних документов.
max
Использует самую высокую оценку релевантности всех соответствующих дочерних документов.
min
Использует самую низкую оценку релевантности всех соответствующих дочерних документов.
sum
Складывает оценки релевантности всех соответствующих дочерних документов.

Примечания

Сортировка

Вы не можете отсортировать результаты запроса has_child с помощью стандартных параметров сортировки.

Если вам нужно отсортировать возвращаемые документы по полю в их дочерних документах, используйте запрос function_score и отсортируйте по полю _score. Например, следующий запрос сортирует возвращаемые документы по полю click_count их дочерних документов.

resp = client.search(
    query={
        "has_child": {
            "type": "child",
            "query": {
                "function_score": {
                    "script_score": {
                        "script": "_score * doc['click_count'].value"
                    }
                }
            },
            "score_mode": "max"
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    has_child: {
      type: "child",
      query: {
        function_score: {
          script_score: {
            script: "_score * doc['click_count'].value",
          },
        },
      },
      score_mode: "max",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "has_child": {
      "type": "child",
      "query": {
        "function_score": {
          "script_score": {
            "script": "_score * doc['click_count'].value"
          }
        }
      },
      "score_mode": "max"
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-has-child-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API