Elasticsearch nested
Вы можете выполнить вложенный запрос в Elasticsearch, используя nested параметр. Вложенный запрос будет искать объекты вложенных полей и возвращать корневой родительский элемент документа, если существует соответствующий объект.
Как использовать nested
Чтобы выполнить вложенный запрос, у вас должен быть индекс, включающий вложенное сопоставление.
Следующий запрос создает индекс с сопоставлением вложенных полей.
PUT nested-index { "mappings": { "properties": { "customers": { "type": "nested" } } } }
Затем создайте документ, содержащий вложенные типы полей и некоторые данные, как показано в примере запроса ниже:
PUT nested-index/_doc/1 { "category": "electronic_purchases", "customers": [ { "first_name": "Barbra", "last_name": "Walker" }, { "first_name": "Michael", "last_name": "Jean" }, { "first_name": "Hannah", "last_name": "Newsome" } ] }
Чтобы запустить вложенный запрос, мы можем выполнить пример, подобный показанному ниже:
GET nested-index/_search { "query": { "nested": { "path": "customers", "query": { "bool": { "must": [ { "match": { "customers.first_name": "Hannah" } } ] } }, "inner_hits": {"highlight": {"fields": {"customers.first_name": {}}}} } } }
Ниже приведен пример ответа на приведенный выше запрос:
Вложенный запрос использует следующие параметры:
- Путь . Параметр пути определяет путь к вложенному объекту, под которым следует выполнить поисковый запрос. Этот параметр является обязательным.
- Запрос — этот параметр определяет поисковый запрос, который будет выполняться по предоставленному вложенному пути. Как и параметр пути, параметр запроса не является обязательным.
- Bool — логический запрос гарантирует, что документы соответствуют указанному условию. Если для логического запроса установлено значение must, предложение set должно находиться в соответствующей записи. Чтобы узнать больше, ознакомьтесь с документацией по логическому запросу.
- Inner_hits – возвращает каждое попадание при поиске в ответе на вложенный ответ. Он принимает такие параметры, как выделение, за которым следует поле для выделения.
Многоуровневые вложенные запросы
Вы также можете использовать многоуровневые вложенные запросы, как показано в примере индекса:
PUT /users { "mappings": { "properties": { "username": { "type": "nested", "properties": { "first_name": { "type": "text" }, "email": { "type": "nested", "properties": { "provider": { "type": "text" }, "prefix": { "type": "text" } } } } } } } }
Добавьте несколько документов с такими данными:
PUT /users/_doc/1 { "username":{ "first_name": "David", "email": [ { "provider": "gmail.com", "prefix": "david123@" }, { "provider": "hotmail.com", "prefix": "davidy123@" } ] } } PUT /users/_doc/2 { "username":{ "first_name": "Lucy", "email": [ { "provider": "outlook.com", "prefix": "lucymail@" }, { "provider": "protonmail.com", "prefix": "lucyp@" } ] } }
Чтобы выполнить многоуровневый вложенный запрос, выполните запрос следующим образом:
GET /users/_search { "query": { "nested": { "path": "username", "query": { "nested": { "path": "username.email", "query": { "bool": { "must": [ {"match": { "username.email.provider": "gmail.com" }} ] } } } } } } }
Ниже приведен пример ответа на полученный запрос:
Заключение
В этом руководстве обсуждается, как выполнять вложенные и многоуровневые вложенные запросы в Elasticsearch.