2014-05-08 8 views
10

Ich habe ein paar Elasticsearch-Felder, die ich vor der Indexierung nicht analysieren möchte. Ich habe gelesen, dass der richtige Weg dies zu tun ist, indem Sie das Index-Mapping ändern. Gerade jetzt meine Abbildung sieht wie folgt aus:Konfigurieren Sie elasticsearch mapping mit java api

{ 
    "test" : { 
    "general" : { 
     "properties" : { 
     "message" : { 
      "type" : "string" 
     }, 
     "source" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

Und ich würde es so aussehen mag:

{ 
    "test" : { 
    "general" : { 
     "properties" : { 
     "message" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
     }, 
     "source" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

Ich habe versucht, die Einstellungen über

client.admin().indices().prepareCreate("test") 
     .setSettings(getGrantSettings()); 

Wo getGrantSettings sich ändern() sieht so aus:

static Settings getGrantSettings(){ 
    JSONObject settingSource = new JSONObject(); 
    try{ 
     settingSource.put("mapping", new JSONObject() 
     .put("message", new JSONObject() 
      .put("type", "string") 
      .put("index", "not_analyzed") 
     )); 
    } catch (JSONException e){ 
     e.printStackTrace(); 
    } 


    Settings set = ImmutableSettings.settingsBuilder() 
      .loadFromSource(settingSource.toString()).build(); 
    return set; 
} 
+1

Ich sehe hier keine Frage. Hast du Probleme? Wenn ja welche? –

Antwort

19

I Zuordnungen zu einem Elasticsearch Index unter Verwendung der Java-API wie folgt erfolgreich angewendet haben:

XContentBuilder mapping = jsonBuilder() 
           .startObject() 
            .startObject("general") 
             .startObject("properties") 
              .startObject("message") 
               .field("type", "string") 
               .field("index", "not_analyzed") 
              .endObject() 
              .startObject("source") 
               .field("type","string") 
              .endObject() 
             .endObject() 
            .endObject() 
           .endObject(); 

    PutMappingResponse putMappingResponse = client.admin().indices() 
       .preparePutMapping("test") 
       .setType("general") 
       .setSource(mapping) 
       .execute().actionGet(); 

Hoffnung, das hilft.

+3

Nur um zu verdeutlichen: jsonBuilder() ist eine statische Methode in org.elasticsearch.common.xcontent.XContentFactory – padilo

+1

Fügen Sie diese Zeile hinzu, wenn Ihr Index vor der Zuordnung client.admin(). Indices() nicht existiert. Create (new CreateIndexRequest (" indexname ")). actionGet(); vor dem Anwenden von Mapping sonst indexMissingException wird geworfen – swaheed

9

Hinzufügen für zukünftige Leser. Bitte beachten Sie, dass Sie das Mapping vor dem Erstellen des aktuellen Index durchführen müssen, sonst erhalten Sie eine Ausnahme. Siehe folgenden Code.

client.admin().indices().create(new CreateIndexRequest("indexname")).actionGet(); 

PutMappingResponse putMappingResponse = client.admin().indices() 
    .preparePutMapping("indexname") 
    .setType("indextype") 
    .setSource(jsonBuilder().prettyPrint() 
       .startObject() 
        .startObject("indextype") 
         .startObject("properties") 
          .startObject("country").field("type", "string").field("index", "not_analyzed").endObject() 
         .endObject() 
        .endObject() 
       .endObject()) 
    .execute().actionGet(); 

IndexResponse response1 = client.prepareIndex("indexname", "indextype") 
    .setSource(buildIndex()) 
    .execute() 
    .actionGet(); 

// Now "Sri Lanka" considered to be a single country :) 
SearchResponse response = client.prepareSearch("indexname" 
    ).addAggregation(AggregationBuilders.terms("countryfacet").field("country")).setSize(30).execute().actionGet(); 
+0

danke viel ich bekam die indexmissingexception nach dem Folgen der Code in der angenommenen Antwort diese Zeile client.admin(). indices(). create (new CreateIndexRequest ("indexname")). actionGet(); löste mein Problem – swaheed

0

Lesen Sie einfach die Definitive Guide sorgfältig:

Obwohl Sie zu einem bestehenden Mapping hinzufügen können, können Sie nicht vorhandene Feldzuordnungen ändern. Wenn für ein Feld bereits ein Mapping vorhanden ist, wurden Daten aus diesem Feld wahrscheinlich indiziert. Wenn Sie die Feldzuordnung ändern würden, wären die indizierten Daten falsch und könnten nicht ordnungsgemäß durchsucht werden.

Quelle: https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#updating-a-mapping

Also Sie müssen es nur tun, wenn Sie das Feld erstellen. Deshalb funktioniert der Code von this answer ohne Probleme.