Add mappings to an Elasticsearch index in realtime

 

Changing mapping on existing index is not an easy task. You may find the reason and possible solutions in here:

http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/


to get current mapping details, here is the sample code:

 

ClusterState cs = client.admin().cluster().prepareState().setFilterIndices("myIndex").execute().actionGet().getState();
IndexMetaData imd = cs.getMetaData().index("myIndex")
MappingMetaData mdd = imd.mapping("myType")


 

 

Put Mappings In Real time:

 

private void putMapping() {
    if (client != null) {
       if (client.admin().indices().prepareExists(IndexName).execute().actionGet().isExists()) {
          XContentBuilder mappings = null;
          try {
             mappings = XContentFactory.jsonBuilder()
		.startObject()
		    .startObject(INDEX_TYPE)
		        .startObject("properties")
			.startObject(FIELD_NAME)
       			 .field("type","string")
		      	 .field("store","yes")
			 .field("index", "analyzed")
			 .field("analyzer", "simple")
			.endObject()
		        .endObject()
		      .endObject()
		.endObject();
          } catch (IOException e) {
	     e.printStackTrace();
          }
          client.admin().indices().prepareClose(IndexName).execute().actionGet();
          client.admin().indices().prepareDeleteMapping(IndexName).setType(INDEX_TYPE).execute().actionGet();
          client.admin().indices().preparePutMapping(IndexName).setIgnoreConflicts(true).setType(INDEX_TYPE).setSource(mappings).execute().actionGet();
	  client.admin().indices().prepareOpen(IndexName).execute().actionGet();
       }

    } else {
	throw new IllegalStateException(" Elastic Search not initialized properly..");
    }
}


 

 

posted on 2013-10-15 08:59  you Richer  阅读(333)  评论(0)    收藏  举报