2015-03-29 1 views
6

Problem: Wie ein Index aus einer JSON-DateiElasticsearch Java API addMapping() und setSettings() Nutzung

Die JSON-Datei enthält eine Definition für den de_brochures Index verwendet erstellen. Es definiert auch einen Analysator de_analyzer mit benutzerdefinierten Filtern, die von dem jeweiligen Index verwendet werden. Da der Json mit curl und Sense arbeitet, gehe ich davon aus, dass ich die Syntax anpassen muss, um mit der Java API zu arbeiten.

Ich möchte nicht XContentFactory.jsonBuilder() verwenden, da der JSON aus einer Datei stammt!

Ich habe die folgende JSON-Datei meine Zuordnung von erstellen und Einstellungen festlegen:

Sense Verwendung mit PUT/indexname es einen Index aus dieser schafft.

{ 
    "mappings": { 
    "de_brochures": { 
     "properties": { 
     "text": { 
      "type": "string", 
      "store": true, 
      "index_analyzer": "de_analyzer" 
     }, 
     "classification": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "language": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    "settings": { 
    "analysis": { 
     "filter": { 
     "de_stopwords": { 
      "type": "stop", 
      "stopwords": "_german_" 
     }, 
     "de_stemmer": { 
      "type": "stemmer", 
      "name": "light_german" 
     } 
     }, 
     "analyzer": { 
     "de_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "de_stopwords", 
      "de_stemmer" 
      ] 
     } 
     } 
    } 
    } 
} 

Als das oben nicht mit addMapping() allein funktionierte ich es in zwei separate Dateien aufgeteilt versucht (Ich erkannte, dass ich die "mappings": und "settings": Teil zu entfernen, hatte):

------ Mapping json ------ 
{ 
    "de_brochures": { 
    "properties": { 
     "text": { 
     "type": "string", 
     "store": true, 
     "index_analyzer": "de_analyzer" 
     }, 
     "classification": { 
     "type": "string", 
     "index": "not_analyzed" 
     }, 
     "language": { 
     "type": "string", 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 
------- Settings json -------- 
{ 
    "analysis": { 
    "filter": { 
     "de_stopwords": { 
     "type": "stop", 
     "stopwords": "_german_" 
     }, 
     "de_stemmer": { 
     "type": "stemmer", 
     "name": "light_german" 
     } 
    }, 
    "analyzer": { 
     "de_analyzer": { 
     "type": "custom", 
     "tokenizer": "standard", 
     "filter": [ 
      "lowercase", 
      "de_stopwords", 
      "de_stemmer" 
     ] 
     } 
    } 
    } 
} 

Diese ist mein Java-Code zum Laden und Hinzufügen/Festlegen der JSON.

CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(index); 
// CREATE SETTINGS 
String settings_json = new String(Files.readAllBytes(brochures_mapping_path)); 
createIndexRequestBuilder.setSettings(settings_json); 
// CREATE MAPPING 
String mapping_json = new String(Files.readAllBytes(brochures_mapping_path)); 
createIndexRequestBuilder.addMapping("de_brochures", mapping_json); 
CreateIndexResponse indexResponse = createIndexRequestBuilder.execute().actionGet(); 

Es ist nicht mehr Beschwerde über die Struktur der Zuordnungsdatei aber es funktioniert nicht jetzt mit dem Fehler:

Caused by: org.elasticsearch.index.mapper.MapperParsingException: Analyzer [de_analyzer] not found for field [text] 

Antwort

4

Lösung: Ich schaffte es mit meiner ursprünglichen JSON-Datei zu tun mit createIndexRequestBuilder.setSource(settings_json);

+0

Bitte fügen Sie die Lösung nicht zu der Frage hinzu. Lösungen sind keine Fragen. Lösungen sind Antworten. Stackoverflow ermutigt Sie, Ihre Fragen selbst zu beantworten, wenn Sie Lösungen finden. Aber bitte tu das in einer Antwort. Das Bearbeiten der Frage, um die Lösung einzuschließen, verwirrt nur die Leser. Vielen Dank! – Vogel612

1

denke ich, das Problem mit der Struktur Ihrer Zuordnungsdatei ist.

Hier ist ein Beispielbeispiel.

mapping.json 
{ 
"en_brochures": { 
    "properties": { 
     "text": { 
      "type": "string", 
      "store": true, 
      "index_analyzer": "en_analyzer", 
      "term_vector": "yes" 
     }, 
     "classification": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "language": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
    } 
} 



String mapping = new String(Files.readAllBytes(Paths.get("mapping.json"))); 
    createIndexRequestBuilder.addMapping('en_brochures', mapping); 
    CreateIndexResponse indexResponse =createIndexRequestBuilder.execute().actionGet(); 

Dies funktioniert in meiner, können Sie versuchen.

+0

Haben Sie eine Ahnung, wie ich in dem „Analysator“ Teil in Ihre json Struktur passen, damit es funktioniert? – Peter

+0

Nachschlagen! Ich habe mich verändert, meine Antwort. Und damit dies funktioniert, müssen Sie Einstellungen hinzufügen (wie Sie es vorher getan haben) – progrrammer

+0

Ich nehme an, Sie haben bereits den en_analyzer hinzugefügt? Wie hast du das gemacht? Sonst klagt es darüber, "en_analyzer" nicht für "text" gefunden zu haben. – Peter