Эластичный поиск вложенных типов со списком внутри вложенного типа

#elasticsearch #nested #nosql

#эластичный поиск #вложенный #nosql

Вопрос:

Возможно ли иметь вложенный тип со списком внутри него в ElasticSearch? Примером может быть что-то, о чем я думал, вот так

 {
  "name" : "Zach",
  "car" : [
    {
      "make" : "Saturn",
      "model" : "SL",
      "colors": ["Red","Blue","Green"]
     },
    {
      "make" : "Saturn",
      "model" : "Imprezza",
      "colors": ["Pink","Green"]
    }
  ]
}
  

Как бы я запросил такой FF?

1) Я хочу запросить у всех людей, что их автомобили «делают» с «Сатурном» и имеют цвета «Зеленый»

2) Я хочу запросить у всех пользователей, что их автомобили имеют цвета «зеленый» или «РОЗОВЫЙ»

Комментарии:

1. Итак, это решило вашу проблему или нет?

Ответ №1:

ДА. Вот как я бы это сделал:

Шаг 1. Настройте сопоставление:

 PUT /index_name
{
  "mappings": {
    "type_name": {
      "properties": {
        "name": {
          "type": "string"
        },
        "car": {
          "type": "nested",
          "properties": {
            "make": {
              "type": "string"
            },
            "model": {
              "type": "string"
            },
            "colors": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
  

Шаг 2. Заполните индекс:

 PUT /index_name/type_name/1
{
  "name": "Zach",
  "car": [
    {
      "make": "Saturn",
      "model": "SL",
      "colors": [
        "Red",
        "Blue",
        "Green"
      ]
    },
    {
      "make": "Saturn",
      "model": "Imprezza",
      "colors": [
        "Pink",
        "Green"
      ]
    }
  ]
}
  

Шаг 3. Запрос индекса.
Примечание: Вам нужно будет использовать bool query для получения документов с несколькими параметрами запроса.

 GET /index_name/type_name/_search
{
  "query": {
    "nested": {
      "path": "car",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "make": "Saturn"
              }
            },
            {
              "match": {
                "colors": "Green"
              }
            }
          ]
        }
      }
    }
  }
}
  

Комментарии:

1. Вопрос, почему «car.colors.color»: «Зеленый»? почему не только «car.colors»?

2. Хороший вопрос. Я изменил свойство colors с объекта на массив, как описано здесь . Это должно упростить ситуацию.

3. Еще один вопрос, почему вы добавили индекс по цветам? «имя_индекса»: «тег»?

4. Вы правы, в этом нет необходимости. Я удалил это из ответа.

5. почему также не использовался вложенный запрос при запросе вложенных объектов?

Ответ №2:

Да, у вас может быть массив вложенных документов.

Вот ваше решение.

Создайте индекс, поместите отображение и данные.

 PUT x3
PUT x3/x4/_mapping
{
   "x4": {
      "properties": {
         "name": {
            "type": "string"
         },
         "car": {
            "type": "nested",
            "properties": {
               "make": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "model": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "colors": {
                  "type": "string",
                  "index": "not_analyzed"
               }
            }
         }
      }
   }
}

PUT /x3/x4/1
{
  "name": "Zach",
  "car": [
    {
      "make": "Saturn",
      "model": "SL",
      "colors": [
        "Red",
        "Blue",
        "Green"
      ]
    },
    {
      "make": "Saturn",
      "model": "Imprezza",
      "colors": [
        "Pink",
        "Green"
      ]
    }
  ]
}
  

1) Я хочу запросить у всех людей, что их автомобили «делают» с «Сатурном» и имеют цвета «Зеленый»

 POST x3/x4/_search
{
    "filter": {
        "nested": {
           "path": "car",
           "filter": {
               "and": {
                  "filters": [
                     {
                         "term": {
                            "make":"Saturn"
                         }
                     },{
                         "term": {
                            "colors":"Green"
                         }
                     }
                  ]
               }
           }
        }
    }
}
  

2) Я хочу запросить у всех пользователей, что их автомобили имеют цвета «зеленый» или «РОЗОВЫЙ»

 POST x3/x4/_search
{
   "filter": {
      "nested": {
         "path": "car",
         "filter": {
            "terms": {
               "car.colors": [
                  "Green" , "Pink"
               ]
            }
         }
      }
   }
}
  

Ссылки:: вложенный фильтр, сопоставление, фильтр терминов

Надеюсь, это поможет!!