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": {}}}}
                }
              }
            }

Ниже приведен пример ответа на приведенный выше запрос:

Вложенный запрос использует следующие параметры:

  1. Путь . Параметр пути определяет путь к вложенному объекту, под которым следует выполнить поисковый запрос. Этот параметр является обязательным.
  2. Запрос — этот параметр определяет поисковый запрос, который будет выполняться по предоставленному вложенному пути. Как и параметр пути, параметр запроса не является обязательным.
  3. Bool — логический запрос гарантирует, что документы соответствуют указанному условию. Если для логического запроса установлено значение must, предложение set должно находиться в соответствующей записи. Чтобы узнать больше, ознакомьтесь с документацией по логическому запросу.
  4. 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.