elasticsearch 5.6.4自動創建索引與mapping映射關系 +Java語言


由於業務上的需求 ,最近在研究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();  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM