由於業務上的需求 ,最近在研究elasticsearch的相關知識 ,在網上查略了大部分資料 ,基本上對elasticsearch的數據增刪改都沒有太大問題 ,這里就不做總結了 。但是,在網上始終沒找到合適的Java語言自動創建索引映射mapping的文章 , 經過自己的研究測試 ,這里做個簡單總結 ,方便自己以后查略 。
首先聲明 ,本代碼只對elasticsearch5.6.4版本做了測試 ,其他版本,未測 ,根據以往經驗 ,至少5.x版本應該是沒有問題的 ,好了直接上代碼 。
package ec.bigdata.analys.eap.util; import ec.bigdata.analys.eap.model.FieldInfo; import org.apache.log4j.Logger; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.List; /** * @author Created by KSpring on 2017/2/1. */ public class ElasticSearchHandler { public static final String fieldType = "type"; private String clusterName; private String ip; private int port; public ElasticSearchHandler() { } public void setField(String clusterName, String ip, int port) { this.clusterName = clusterName; this.ip = ip; this.port = port; } private static final Logger logger = Logger.getLogger(ElasticSearchHandler.class); /** * 取得實例 * @return */ public synchronized TransportClient getTransportClient() { TransportClient client = null ; try { Settings settings = Settings.builder().put("cluster.name", clusterName) /* .put("client.transport.sniff", true)*/ .put("client.transport.ping_timeout", "30s").build(); client = new PreBuiltTransportClient(settings); String[] ips = ip.split(","); for (int i = 0; i < ips.length; i++) { client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ips[i]), port)); } } catch (UnknownHostException e) { e.printStackTrace(); } return client; } /** * 關閉連接 * @param client es客戶端 */ public void close(TransportClient client) { client.close(); } /** * 為集群添加新的節點 * @param name * @param client es客戶端 */ public synchronized void addNode(String name,TransportClient client) { try { client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(name), 9300)); } catch (UnknownHostException e) { e.printStackTrace(); } } /** * 刪除集群中的某個節點 * @param client es客戶端 * @param name */ public synchronized void removeNode(String name,TransportClient client) { try { client.removeTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(name), 9300)); } catch (UnknownHostException e) { e.printStackTrace(); } } /** * 創建mapping * @param index 索引 * @param type 類型 * @param client es客戶端 * @param xMapping mapping描述 */ public void createBangMapping(String index, String type, XContentBuilder xMapping,TransportClient client) { PutMappingRequest mapping = Requests.putMappingRequest(index).type(type).source(xMapping); client.admin().indices().putMapping(mapping).actionGet(); } /** * 創建索引 * * @param index 索引名稱 * @param client es客戶端 */ public void createIndex(String index,TransportClient client) { CreateIndexRequest request = new CreateIndexRequest(index); client.admin().indices().create(request); } /** * 根據信息自動創建索引與mapping * 構建mapping描述 有問題 * @param fieldInfoList 字段信息 * @param client es客戶端 * @return */ public void createIndexAndCreateMapping(String index, String type,List<FieldInfo> fieldInfoList,TransportClient client) { XContentBuilder mapping = null; try { CreateIndexRequestBuilder cib=client.admin() .indices().prepareCreate(index); mapping = XContentFactory.jsonBuilder() .startObject() .startObject("properties"); //設置之定義字段 for(FieldInfo info : fieldInfoList){ String field = info.getField(); String dateType = info.getType(); if(dateType == null || "".equals(dateType.trim())){ dateType = "String"; } dateType = dateType.toLowerCase(); Integer participle = info.getParticiple(); if("string".equals(dateType)){ if(participle == 1) { mapping.startObject(field) .field("type","text") .field("analyzer","ik_smart") .endObject(); }else if(participle == 2){ mapping.startObject(field) .field("type","text") .field("analyzer","ik_max_word") .endObject(); }else { mapping.startObject(field) .field("type","keyword") .field("index","not_analyzed") .endObject(); } }else if("date".equals(dateType)){ mapping.startObject(field) .field("type",dateType) .field("format","yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis") .endObject(); }else { mapping.startObject(field) .field("type",dateType) .field("index","not_analyzed") .endObject(); } } mapping.endObject() .endObject(); cib.addMapping(type, mapping); cib.execute().actionGet(); } catch (IOException e) { System.out.println("創建索引發生異常"); } } /** * 創建索引與mapping模板 * @param index 索引字段 * @param type 類型 * @param client 客戶端 * @throws IOException */ public void createMapping(String index, String type,TransportClient client) throws IOException { CreateIndexRequestBuilder cib=client.admin() .indices().prepareCreate(index); XContentBuilder mapping = XContentFactory.jsonBuilder() .startObject() .startObject("properties") //設置之定義字段 .startObject("id")//字段id .field("type","integer")//設置數據類型 .field("index","not_analyzed") .endObject() .startObject("classs") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("courseClass") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("courseClassExam") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("examnum") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("ok") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("room") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("score") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("student") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("updatetime") .field("type","integer") .field("index","not_analyzed") .endObject() .startObject("desc") .field("type","text") .field("analyzer","ik_smart")//ik_max_word .endObject() .startObject("name") .field("type","string") .field("index","not_analyzed") .endObject() .endObject() .endObject(); cib.addMapping(type, mapping); cib.execute().actionGet(); } }