2012-09-11 11 views
18

chciałbym następujące ustawienia i mapowania ustawione na już istniejącego indeksu w Elasticsearch:Zmień ustawienia i mapowania na istniejący indeks Elasticsearch

{ 
    "analysis": { 
     "analyzer": { 
      "dot-analyzer": { 
       "type": "custom", 
       "tokenizer": "dot-tokenizer" 
      } 
     }, 
     "tokenizer": { 
      "dot-tokenizer": { 
       "type": "path_hierarchy", 
       "delimiter": "." 
      } 
     } 
    } 
} 

{ 
    "doc": { 
     "properties": { 
      "location": { 
       "type": "string", 
       "index_analyzer": "dot-analyzer", 
       "search_analyzer": "keyword" 
      } 
     } 
    } 
} 

Próbowałem dodać te dwa wiersze kodu:

client.admin().indices().prepareUpdateSettings(Index).setSettings(settings).execute().actionGet(); 
client.admin().indices().preparePutMapping(Index).setType(Type).setSource(mapping).execute().actionGet(); 

Ale ta jest wynikiem:

org.elasticsearch.index.mapper.MapperParsingException: Analyzer [dot-analyzer] not found for field [location] 

Anyone? Wielkie dzięki,

Stine


To wydaje się działać:

if (client.admin().indices().prepareExists(Index).execute().actionGet().exists()) {    
    client.admin().indices().prepareClose(Index).execute().actionGet(); 
    client.admin().indices().prepareUpdateSettings(Index).setSettings(settings.string()).execute().actionGet(); 
    client.admin().indices().prepareOpen(Index).execute().actionGet(); 
    client.admin().indices().prepareDeleteMapping(Index).setType(Type).execute().actionGet(); 
    client.admin().indices().preparePutMapping(Index).setType(Type).setSource(mapping).execute().actionGet(); 
} else { 
    client.admin().indices().prepareCreate(Index).addMapping(Type, mapping).setSettings(settings).execute().actionGet(); 
} 
+0

Możliwy duplikat [błąd przy próbie aktualizacji ustawień] (http://stackoverflow.com/questions/19758335/error-when-trying-to-update-the-settings) – RASG

Odpowiedz

32

Jeśli spojrzeć na ustawieniach po wysłaniu zmiany zauważysz, że analizator nie ma. W rzeczywistości nie można zmienić sekcji analizy ustawień na indeksie bieżącym. Lepiej go utworzyć za pomocą pożądanych ustawień, w przeciwnym razie możesz go po prostu zamknąć:

Gdy indeks jest zamknięty, możesz wysłać nowe ustawienia. Po tym można ponownie otworzyć indeksu:

curl -XPOST localhost:9200/index_name/_open 

Podczas gdy indeks jest zamknięte nie używa żadnych zasobów klastra, ale nie jest czytelny, ani zapisu. Jeśli chcesz, aby zamknąć i ponownie otworzyć indeks używając Java API można użyć następującego kodu:

client.admin().indices().prepareClose(indexName).execute().actionGet(); 
//TODO update settings 
client.admin().indices().prepareOpen(indexName).execute().actionGet(); 
+0

Dziękuję za odpowiedź. – Stine

+3

Twoja sugestia nie działa dla mnie - po zamknięciu indeksu otrzymuję IndexAlreadyExistsException. ElasticSearch 1.3.4 – chester89

+0

@javanna po ponownym otwarciu indeksu, co się stanie? Czy ES będzie musiał ponownie indeksować wszystko, ponieważ masz nowy analizator? – micah

Powiązane problemy