webentwicklung-frage-antwort-db.com.de

Konfigurieren Sie die Elasticsearch-Zuordnung mit der Java-API

Ich habe einige Elasticsearch-Felder, die ich vor der Indizierung nicht analysieren möchte. Ich habe gelesen, dass der richtige Weg, dies zu tun, darin besteht, die Indexzuordnung zu ändern. Im Moment sieht mein Mapping so aus:

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

Und ich möchte, dass es so aussieht:

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

Ich habe versucht, die Einstellungen über zu ändern

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

So sieht getGrantSettings () 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;
}
10
user3618259

Ich habe mithilfe der Java-API wie folgt erfolgreich Zuordnungen auf einen Elasticsearch-Index angewendet:

 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();

Hoffe das hilft.

20
Paige Cook

Dies für zukünftige Leser hinzufügen. Beachten Sie, dass Sie eine Zuordnung durchführen müssen, bevor Sie den eigentlichen Index erstellen können, da sonst eine Ausnahme auftritt. 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(); 
11
Charith

Lesen Sie einfach den Definitiven Leitfaden sorgfältig durch:

Obwohl Sie eine vorhandene Zuordnung ergänzen können, können Sie vorhandene Feldzuordnungen nicht ändern. Wenn für ein Feld bereits eine Zuordnung vorhanden ist, wurden die Daten aus diesem Feld wahrscheinlich indiziert. Wenn Sie die Feldzuordnung ändern würden, wären die indizierten Daten falsch und nicht ordnungsgemäß durchsuchbar.

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

Sie müssen es also nur tun, wenn Sie das Feld erstellen. Deshalb funktioniert der Code von diese Antwort ohne Probleme.

0
neun24

Es stellte sich heraus, dass Elasticsearch-Dokumente zu diesem Thema veraltet sind. not_analyzed existiert nicht mehr und string ist jetzt text. Nach einigem Ausprobieren kam ich auf folgendes:

CreateIndexRequest createIndexRequest = new CreateIndexRequest("yourIndexName");
XContentBuilder mapping = jsonBuilder()
                .startObject()
                  .startObject("properties")
                    .startObject("yourProperty")
                      .field("type", "keyword")
                    .endObject()
                  .endObject()
                .endObject();
createIndexRequest.mapping("yourEntityName", mapping);
client.indices().create(createIndexRequest);

Jetzt kann yourProperty nur mit Termabfrage auf exakten Wert abgefragt werden.

0
bAZtARd