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?

questionAnswers(1)

yourAnswerToTheQuestion