由于业务上的需求 ,最近在研究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();
}
}

elasticsearch 5.6.4自动创建索引与mapping映射关系 +Java语言的更多相关文章

  1. Elasticsearch索引的操作,利用kibana 创建/删除一个es的索引及mapping映射

    索引的创建及删除 1. 通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射. 利用Kibana提供的DevTools来执行命令,要创建一个索引 ...

  2. kibana自动创建索引

    一般索引按月.季或年为单位创建索引.我这里写成logstash-www-2019-03,www是URL的二级域名.格式类型完全根据自己方便就行. 当ELK集群中的索引过多时,我这里有100多个不同的日 ...

  3. apach hadoop2.6 集群利用Phoenix 4.6-hbase 批量导入并自动创建索引

    基础环境: 1.安装apach 版本hadoop2.6 2.部署hbase1.0.0 3.下载phoenix-4.6.0-HBase-1.0.下载地址(http://mirror.nus.edu.sg ...

  4. ES--Kibana相关操作创建索引和Mapping

    创建索引 kibana 使用如下命令进行创建索引内容. PUT test_index/ 创建别名 POST _aliases { "actions": [{ "add&q ...

  5. phoenix 利用CsvBulkLoadTool 批量带入数据并自动创建索引

    需要先创建表: CREATE TABLE IF NOT EXISTS population ( state CHAR() NOT NULL, city VARCHAR NOT NULL, popula ...

  6. 使用MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig ...

  7. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  8. Elasticsearch(ES) 创建索引

    欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...

  9. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

随机推荐

  1. XGBoost参数调优

    XGBoost参数调优 http://blog.csdn.net/hhy518518/article/details/54988024 摘要: 转载:http://blog.csdn.NET/han_ ...

  2. Common Lisp

    [Common Lisp] 1.操作符是什么? 2.quote. 3.单引号是quote的缩写. 4.car与cdr方法. 5.古怪的if语句. 6.and语句. 7.判断是真假. null 与 no ...

  3. 每月IT摘录201807

    一.技术 1.专注于一个领域,横向扩展其他领域的技术.2.想得太多,做得太少. 3.想要成为一名web开发高手.必须熟悉以下内容: a.每次请求和响应的背后究竟发生了哪些步骤?客户端和服务器是如何通过 ...

  4. 110. Balanced Binary Tree (Tree; DFS)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. Marshal.FreeHGlobal 方法 (IntPtr)

    释放以前从进程的非托管内存中分配的内存. 命名空间:   System.Runtime.InteropServices程序集:  mscorlib(位于 mscorlib.dll) 下面的示例演示如何 ...

  6. 网页截图API接口,一键自动生成网页截图

    背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...

  7. Java程序设计17——多线程-Part-C

    11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...

  8. web api control注册及重写DefaultHttpControllerSelector、ApiControllerActionSelector、ApiControllerActionInvoker(转)

    出处:http://www.cnblogs.com/kingCpp/p/4651154.html namespace EWorkpal.WebApi { public class HttpNotFou ...

  9. java文件的读写程序代码

    package textopen; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutp ...

  10. github的使用经历

    首先我打开百度搜索markdown,点击这个在线编辑器,开始编写,如下图: 预览效果如下: 然后打开github的网页登录后,点击下图这个标志: 然后给给要上传的一个命名: 然后选择README 确认 ...