Elasticsearch: есть ли способ объявить для всех (возможно, динамических) подполей поля объекта как строку?
У меня есть doc_type с отображением, похожим на это очень упрощенное:
{
"test":{
"properties":{
"name":{
"type":"string"
},
"long_searchable_text":{
"type":"string"
},
"clearances":{
"type":"object"
}
}
}
}
Полеclearances
должен быть объектом с серией буквенно-цифровых идентификаторов для целей фильтрации. Типичный документ будет иметь этот формат:
{
"name": "Lord Macbeth",
"long_searchable_text": "Life's but a walking shadow, a poor player, that..."
"clearances": {
"glamis": "aa2862jsgd",
"cawdor": "3463463551"
}
}
Проблема в том, что иногда при индексации первым индексируется содержимое нового поля внутри поля объектаclearances
будет полностью числовым, как в случае выше. Это заставляет Elasticsearch выводить тип этого поля какlong
, Но это случайность. Поле может быть буквенно-цифровым в другом документе. Когда приходит последний документ, содержащий буквенно-цифровое значение в этом поле, я получаю исключение при разборе:
{"error":"MapperParsingException[failed to parse [clearances.cawdor]]; nested: NumberFormatException[For input string: \"af654hgss1\"]; ","status":400}%
Я попытался решить это с помощью динамического шаблона, определенного следующим образом:
{
"test":{
"properties":{
"name":{
"type":"string"
},
"long_searchable_text":{
"type":"string"
},
"clearances":{
"type":"object"
}
}
},
"dynamic_templates":[
{
"source_template":{
"match":"clearances.*",
"mapping":{
"type":"string",
"index":"not_analyzed"
}
}
}
]
}
Но случается так, что если первый индексированный документ имеетclearance.some_subfield
значение, которое может быть проанализировано как целое число, будет выведено как целое число, и все последующие документы, имеющие буквенно-цифровые значения в этом подполе, не будут проиндексированы.
Я мог бы перечислить все текущие подполя в отображении, но их много, и я ожидаю, что их число будет расти в будущем (инициирование обновления отображения и необходимость полной переиндексации ...).
Есть ли способ заставить эту работу не прибегать к полной переиндексации при каждом добавлении нового подполя?