使用java api配置elasticsearch映射

use*_*259 11 java mapping analyzer elasticsearch

在索引之前,我有一些我不想分析的弹性搜索字段.我已经读过,正确的方法是改变索引映射.现在我的映射看起来像这样:

{
  "test" : {
   "general" : {
      "properties" : {
        "message" : {
          "type" : "string"
        },
        "source" : {
          "type" : "string"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

{
  "test" : {
   "general" : {
      "properties" : {
        "message" : {
          "type" : "string",
          "index" : "not_analyzed"
        },
        "source" : {
          "type" : "string"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我一直试图通过改变设置

client.admin().indices().prepareCreate("test")
        .setSettings(getGrantSettings());
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Pai*_*ook 20

我已成功使用Java API将映射应用于Elasticsearch索引,如下所示:

 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();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 只是为了澄清:jsonBuilder()是org.elasticsearch.common.xcontent.XContentFactory中的静态方法 (3认同)

Cha*_*ith 11

为未来的读者添加这个.请注意,您需要在创建实际索引之前执行映射,否则您将获得异常.请参阅以下代码.

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(); 
Run Code Online (Sandbox Code Playgroud)