Add mappings to an Elasticsearch index in realtime

来源:互联网 发布:nba2k16mc生涯数据 编辑:程序博客网 时间:2024/05/17 20:02

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..");    }}