Обработка неожиданного массива/объекта в строковом поле — ElasticSearch

#php #elasticsearch #logging

Вопрос:

Наличие журналов обработки ElasticSearch-это здорово. Но иметь программу, которая отправляет разные типы данных для одного и того же поля, — это не так уж много…

Например:

Одним из запросов может быть

 send('id' => '123')
 

и еще один

 send('id' => ['123']) 
 

Это не удастся для второй отправки, так как Elastic отклонит ее даже с ignore_malformed: true (тип поля установлен в текст).

То же самое произойдет и с объектом

Есть ли какой-либо другой способ придать полям более динамичную настройку значений?

Или мне следует просто просмотреть код и изменить все запросы…

Ответ №1:

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

Добавление рабочего примера с отображением индексов и данными

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "id": {
        "type": "text"
      }
    }
  }
}
 

Данные индекса 1:

 {
  "id": "123"
}
 

Данные индекса 2:

 {
  "id": [
    "123",
    "56"
  ]
}
 

Оба этих документа будут успешно проиндексированы без каких-либо исключений

Правка 1:

Если вы просто хотите, чтобы документы были проиндексированы (а не искали), вы можете задать id тип объекта "enabled": false . Это позволит индексировать весь формат данных (текст, массив, объект).

 {
  "mappings": {
    "properties": {
      "id": {
        "type": "object",
        "enabled": false
      }
    }
  }
}
 

Следующие документы будут проиндексированы с использованием приведенного выше сопоставления

Тип объекта:

 {
  "id": {
    "age": 50,
    "name": {
      "first": "John"
    }
  }
}
 

Тип массива:

 {
  "id": [
    "123",
    "56"
  ]
}
 

Строковый тип:

 {
  "id": "123"
}
 

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

1. Спасибо вам за ваш ответ. Но как я мог бы обрабатывать массив с помощью KVP (‘idNum’ => «123»)? Также, что делать, если объект приходит вместо массива?

2. @lucian24 Ты можешь попробовать все наоборот. Пожалуйста, ознакомьтесь с обновленной частью ответа

3. Это все исправляет. Спасибо!