Elasticsearch: czy istnieje sposób na zadeklarowanie wszystkich (prawdopodobnie dynamicznych) podpól pola obiektu jako ciągu?
Mam typ doc_type z mapowaniem podobnym do tego bardzo uproszczonego:
{
"test":{
"properties":{
"name":{
"type":"string"
},
"long_searchable_text":{
"type":"string"
},
"clearances":{
"type":"object"
}
}
}
}
Poleclearances
powinien być obiektem z serią alfanumerycznych identyfikatorów do celów filtrowania. Typowy dokument będzie miał ten format:
{
"name": "Lord Macbeth",
"long_searchable_text": "Life's but a walking shadow, a poor player, that..."
"clearances": {
"glamis": "aa2862jsgd",
"cawdor": "3463463551"
}
}
Problem polega na tym, że czasami podczas indeksowania pierwsza indeksowana treść nowego pola w polu obiektuclearances
będzie całkowicie numeryczny, jak w powyższym przypadku. Powoduje to, że Elasticsearch określa typ tego pola jakolong
. Ale to wypadek. Pole może być alfanumeryczne w innym dokumencie. Gdy pojawi się ostatni dokument zawierający wartość alfanumeryczną w tym polu, otrzymuję wyjątek parsowania:
{"error":"MapperParsingException[failed to parse [clearances.cawdor]]; nested: NumberFormatException[For input string: \"af654hgss1\"]; ","status":400}%
Próbowałem rozwiązać ten problem za pomocą dynamicznego szablonu zdefiniowanego w ten sposób:
{
"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"
}
}
}
]
}
Ale to się dzieje, jeśli pierwszy indeksowany dokument maclearance.some_subfield
wartość, którą można przeanalizować jako liczbę całkowitą, można by wywnioskować jako liczbę całkowitą, a wszystkie kolejne dokumenty, które mają wartości alfanumeryczne w tym subpolu, nie będą indeksowane.
Mógłbym wymienić wszystkie aktualne podpola w mapowaniu, ale jest ich wiele i oczekuję, że ich liczba wzrośnie w przyszłości (wyzwalając aktualizację mapowania i potrzebę pełnej reindeksacji ...).
Czy istnieje sposób na wykonanie tej pracy bez uciekania się do tej pełnej reindeksacji za każdym razem, gdy dodawane jest nowe podpole?