2012-09-11 1 views
18

Vorrei le seguenti impostazioni e mappatura impostati su un indice già esistente in elasticsearch:Modificare le impostazioni e le mappature su indice esistente in 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" 
      } 
     } 
    } 
} 

ho cercato di aggiungere queste due righe di codice:

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

Ma questo è il risultato:

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

Chiunque? Grazie mille,

Stine


Questo sembra funzionare:

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

Eventuali duplicati di [errore quando si cerca di aggiornare le impostazioni] (http://stackoverflow.com/questions/19758335/error-when-trying-to-update-the-settings) – RASG

risposta

32

Se guardate le impostazioni dopo l'invio delle modifiche si noterà che l'analizzatore non c'è. In effetti, non è possibile modificare la sezione di analisi delle impostazioni su un indice live. Meglio per creare con le impostazioni desiderate, altrimenti si può semplicemente chiudere:

Mentre l'indice è chiuso è possibile inviare le nuove impostazioni. Dopo di che è possibile riaprire l'indice:

curl -XPOST localhost:9200/index_name/_open 

Mentre l'indice è chiusa non utilizza alcuna risorsa cluster, ma non è leggibile né scrivibile. Se si desidera chiudere e riaprire l'indice utilizzando l'API Java è possibile utilizzare il seguente codice:

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

Grazie per la risposta. – Stine

+3

Il tuo suggerimento non ha funzionato per me: dopo aver chiuso un indice, ottengo IndexAlreadyExistsException. ElasticSearch 1.3.4 – chester89

+0

@javanna quando riapri l'indice, cosa succederà? Sarà necessario ri-indicizzare tutto perché hai un nuovo analizzatore? – micah