zoukankan      html  css  js  c++  java
  • 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();  
        }  
    }  
  • 相关阅读:
    CMD 已存在的表, 没有主键的 添加主键属性
    回调函数 call_back
    在Ubuntu下安装MySQL,并将它连接到Navicat for Mysql
    F查询和Q查询,事务及其他
    Djabgo ORM
    Diango 模板层
    Django视图系统
    Django简介
    Web 框架
    HTTP协议
  • 原文地址:https://www.cnblogs.com/a-du/p/8807661.html
Copyright © 2011-2022 走看看