Почему я не могу смешивать свои типы данных в Elasticsearch? - PullRequest
0 голосов
/ 03 марта 2019

В настоящее время я пытаюсь реализовать вариант примера машины здесь:

https://www.elastic.co/blog/managing-relations-inside-elasticsearch

Если я запустил:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":"2015"
      }
   ]
}

код работаетправильно.

Но если я удаляю индекс и изменяю 2015 из строки на число:

DELETE /vehicle
PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

, я получаю следующее сообщение об ошибке:

{"error": {"root_cause": [{"type": "invalid_argument_exception", "reason": "mapper [metadata.value] другого типа, current_type [long], merged_type [text]"}], "type": "invalid_argument_exception", "reason": "mapper [metadata.value] другого типа, current_type [long], merged_type [text]"}, "status": 400}

Как мнеисправить эту ошибку?

1 Ответ

0 голосов
/ 03 марта 2019
PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

После удаления индекса и последующей попытки индексировать новый документ, как указано выше, выполняются следующие шаги:

  1. Когда эластик не может найти индекс по имени vehicleи автоматическое создание индекса включено (которое по умолчанию включено), оно создаст новый индекс с именем vehicle.
  2. На основе входного документа, эластик теперь пытается лучше угадать тип данных для полейдокумент.Это известно как отображение динамического поля .
  3. Для указанного выше документа, поскольку metadata является массивом объектов, предполагается, что поле metadata имеет тип данных object.
  4. Теперь наступает шаг для определения типа данных полей отдельного объекта.Когда он встречает первый объект, он находит два поля key и value.Оба эти поля имеют строковое значение (make и Saturn соответственно) и, следовательно, эластик идентифицирует тип данных для обоих полей как text.
  5. Эластик, затем попытайтесь определить отображение следующим образом:

      {
        "properties": {
          "metadata": {
            "properties": {
              "key": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "value": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }

Когда он сталкивается со вторым объектом, для которого значение поля value является числовым (2015), для которого он принимает тип данных как long.Это приводит к конфликту с ранее идентифицированным типом данных, который был text.Поле не может иметь смешанный тип данных.Типы данных являются строгими, и, следовательно, ошибки.

Для устранения ошибки необходимо убедиться, что входные значения для полей имеют для каждого объекта того же типа, как показано ниже:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":2016
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

Для вышесказанного лучше использовать:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "make":"Saturn",
         "year": 2015
      }
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...