Предотвращение исключения недопустимого аргумента для объектов внутри массивов в ElasticSearch

#arrays #object #elasticsearch

#массивы #объект #elasticsearch

Вопрос:

Я пытаюсь импортировать объекты JSON в базу данных ElasticSearch. Исправление должно предотвратить следующую ошибку:

 "type":"illegal_argument_exception","reason":"mapper [state.config.assertions.target] cannot be changed from type [text] to [long]"},"status":400
  

Массив объектов, вызывающих проблемы, выглядит следующим образом:

 "assertions": [
          {
            "operator": "lessThan",
            "type": "responseTime",
            "target": 3000
          },
          {
            "operator": "is",
            "type": "statusCode",
            "target": 200
          },
          {
            "operator": "is",
            "property": "content-type",
            "type": "header",
            "target": "text/html"
          }
        ]
  

Сопоставление ожидает тип «long» после двух объектов и выдает ошибку из-за «текста», который он получает с третьим объектом.

Создание объекта «вложенным» вызовет ту же ошибку:

       "assertions": {
        "type": "nested"
      }
  

Это решение устраняет ошибку, но оно только устраняет проблему, а не предотвращает ее.

 "assertions": {
                "properties": {
                  "operator": {
                    "type": "keyword"
                  },
                  "type": {
                    "type": "keyword"
                  },
                  "target": {
                    "type": "keyword"
                  }
                }
              }
  

Сопоставление должно оставаться включенным для запроса.

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

Ответ №1:

Вы не можете предотвратить это с помощью сопоставления elasticsearch, каждое поле в elasticsearch может иметь только один тип данных и выдаст вам исключение, если вы попытаетесь сохранить что-либо, что не соответствует типу данных в сопоставлении, например, тот, который вы получили.

У вас не может быть поля, в котором хранится numeric значение для одного документа и keyword значение для другого.

Если у вас есть поле, которое может иметь в качестве значения разные типы данных, такие как числа, логические значения и слова, вам следует сопоставить это поле так keyword , как вы это делали, если вы не создадите сопоставление для поля перед индексацией, elasticsearch создаст сопоставление при первом получении документа споле и будет использовать это значение для создания сопоставления.

Что вы можете сделать, по крайней мере, для индексации части документа, так это установить для параметра ignore_malformed значение true, таким образом, если у вас есть исключение сопоставления для поля, только это поле будет отклонено, а не весь документ.