Настройка отображения elasticsearch с помощью java api

У меня есть несколько полей elasticsearch, которые я не хочу анализировать перед индексацией. Я прочитал, что правильный способ сделать это - изменить отображение индекса. Прямо сейчас мое сопоставление выглядит следующим образом:

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

И я бы хотел, чтобы это выглядело так:

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

Я пытаюсь изменить настройки с помощью

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

Где getGrantSettings() выглядит следующим образом:

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

Я успешно применил сопоставления с индексом Elasticsearch, используя Java API, как показано ниже:

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

Надеюсь, что это поможет.

Ответ 2

Добавление этого для будущих читателей. Обратите внимание, что вам необходимо выполнить сопоставление до создания фактического индекса, или вы получите исключение. См. Следующий код.

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

Ответ 3

Просто внимательно прочитайте Окончательное руководство:

Хотя вы можете добавить к существующему сопоставлению, вы не можете изменить существующие сопоставления полей. Если сопоставление уже существует для поля, данные из этого поля, вероятно, были проиндексированы. Если бы вы изменили сопоставление полей, индексированные данные были бы неправильными и не были бы правильно доступны для поиска.

Источник: https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#updating-a-mapping

Итак, вам просто нужно сделать это, когда создаете поле. Вот почему код этого ответа работает без проблем.