Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Query DSL ›Объединение запросов

Запрос Nested

Оборачивает другой запрос для поиска по вложенным полям.

Запрос nested ищет объекты вложенных полей, как если бы они были индексированы как отдельные документы. Если объект соответствует поиску, запрос nested возвращает родительский документ верхнего уровня.

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

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

Для использования запроса nested ваш индекс должен включать отображение вложенного поля. Например:

PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "obj1": {
        "type": "nested"
      }
    }
  }
}

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

GET /my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "obj1",
      "query": {
        "bool": {
          "must": [
            { "match": { "obj1.name": "blue" } },
            { "range": { "obj1.count": { "gt": 5 } } }
          ]
        }
      },
      "score_mode": "avg"
    }
  }
}

Параметры верхнего уровня для запроса nested

path
(Обязательно, строка) Путь к вложенному объекту, который вы хотите найти.
query

(Обязательно, объект запроса) Запрос, который вы хотите выполнить на вложенных объектах в path. Если объект соответствует поиску, запрос nested возвращает родительский документ верхнего уровня.

Вы можете искать вложенные поля с помощью нотации точек, которая включает полный путь, например, obj1.name.

Многоуровневая вложенность автоматически поддерживается и обнаруживается, что приводит к внутреннему запросу nested для автоматического соответствия соответствующему уровню вложенности, а не корню, если он существует внутри другого вложенного запроса.

См. Многоуровневые вложенные запросы для примера.

score_mode

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

avg (По умолчанию)
Используется средняя оценка релевантности всех сопоставленных дочерних объектов.
max
Используется наивысшая оценка релевантности всех сопоставленных дочерних объектов.
min
Используется наименьшая оценка релевантности всех сопоставленных дочерних объектов.
none
Оценки релевантности сопоставленных дочерних объектов не используются. Запрос присваивает родительским документам оценку 0.
sum
Суммируются оценки релевантности всех сопоставленных дочерних объектов.
ignore_unmapped

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

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

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

Примечания

Контекст запросов сценариев

Если вы выполняете запрос script внутри вложенного запроса, вы можете получить доступ только к значениям документов из вложенного документа, а не из родительского или корневого документа.

Многоуровневые вложенные запросы

Чтобы увидеть, как работают многоуровневые вложенные запросы, сначала вам нужен индекс, который имеет вложенные поля. Следующий запрос определяет отображения для индекса drivers с вложенными полями make и model.

PUT /drivers
{
  "mappings": {
    "properties": {
      "driver": {
        "type": "nested",
        "properties": {
          "last_name": {
            "type": "text"
          },
          "vehicle": {
            "type": "nested",
            "properties": {
              "make": {
                "type": "text"
              },
              "model": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

Далее, проиндексируйте некоторые документы в индекс drivers.

PUT /drivers/_doc/1
{
  "driver" : {
        "last_name" : "McQueen",
        "vehicle" : [
            {
                "make" : "Powell Motors",
                "model" : "Canyonero"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }
}

PUT /drivers/_doc/2?refresh
{
  "driver" : {
        "last_name" : "Hudson",
        "vehicle" : [
            {
                "make" : "Mifune",
                "model" : "Mach Five"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }
}

Теперь вы можете использовать многоуровневый вложенный запрос для сопоставления документов, основанных на полях make и model.

GET /drivers/_search
{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                { "match": { "driver.vehicle.make": "Powell Motors" } },
                { "match": { "driver.vehicle.model": "Canyonero" } }
              ]
            }
          }
        }
      }
    }
  }
}

Запрос поиска возвращает следующий ответ:

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.7349272,
    "hits" : [
      {
        "_index" : "drivers",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 3.7349272,
        "_source" : {
          "driver" : {
            "last_name" : "McQueen",
            "vehicle" : [
              {
                "make" : "Powell Motors",
                "model" : "Canyonero"
              },
              {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
              }
            ]
          }
        }
      }
    ]
  }
}

must_not условия и nested запросы

Если запрос nested соответствует одному или нескольким вложенным объектам в документе, он возвращает документ как совпадение. Это относится даже в том случае, если другие вложенные объекты в документе не соответствуют запросу. Имейте это в виду при использовании запроса nested, содержащего внутреннее условие must_not.

Используйте параметр inner_hits, чтобы увидеть, какие вложенные объекты соответствуют запросу nested.

Например, следующий запрос использует внешний запрос nested с внутренним условием must_not.

PUT my-index
{
  "mappings": {
    "properties": {
      "comments": {
        "type": "nested"
      }
    }
  }
}

PUT my-index/_doc/1?refresh
{
  "comments": [
    {
      "author": "kimchy"
    }
  ]
}

PUT my-index/_doc/2?refresh
{
  "comments": [
    {
      "author": "kimchy"
    },
    {
      "author": "nik9000"
    }
  ]
}

PUT my-index/_doc/3?refresh
{
  "comments": [
    {
      "author": "nik9000"
    }
  ]
}

POST my-index/_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "bool": {
          "must_not": [
            {
              "term": {
                "comments.author": "nik9000"
              }
            }
          ]
        }
      }
    }
  }
}

Поиск возвращает:

{
  ...
  "hits" : {
    ...
    "hits" : [
      {
        "_index" : "my-index",
        "_type": "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "comments" : [
            {
              "author" : "kimchy"
            }
          ]
        }
      },
      {
        "_index" : "my-index",
        "_type": "_doc",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "comments" : [
            {
              "author" : "kimchy"              
            },
            {
              "author" : "nik9000"             
            }
          ]
        }
      }
    ]
  }
}

Этот вложенный объект соответствует запросу. В результате поиск возвращает родительский документ объекта как совпадение.

Этот вложенный объект не соответствует запросу. Поскольку другой вложенный объект в том же документе соответствует запросу, поиск по-прежнему возвращает родительский документ как совпадение.

Чтобы исключить документы с любыми вложенными объектами, которые соответствуют запросу nested, используйте внешнее условие must_not.

POST my-index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "comments",
            "query": {
              "term": {
                "comments.author": "nik9000"
              }
            }
          }
        }
      ]
    }
  }
}

Поиск возвращает:

{
  ...
  "hits" : {
    ...
    "hits" : [
      {
        "_index" : "my-index",
        "_type": "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "comments" : [
            {
              "author" : "kimchy"
            }
          ]
        }
      }
    ]
  }
}

© 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/7.17/query-dsl-nested-query.html

Spec-Zone.ru

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