#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. Это все исправляет. Спасибо!