由于业务上的需求 ,最近在研究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. Swift3.0P1 语法指南——类和结构体

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  2. GSM Hacking Part② :使用SDR捕获GSM网络数据并解密

    0×00 在文章第一部分 GSM Hacking Part① :使用SDR扫描嗅探GSM网络 搭建了嗅探GSM流量的环境,在第二部中,我们来讨论如何捕获发短信以及通话过程中的流量,从捕获到的数据中解密 ...

  3. 用audacity制作循环背景音乐

    用audacity制作循环音乐: 1,将音乐前面一段剪切,粘贴到结尾. 2,选择包含接缝的一个区间,然后 菜单->效果->crossfade clips.

  4. C#备份还原MySql数据库

    原文:C#备份还原MySql数据库 项目结束,粘点代码出来让Google或Baidu一下,原因是现在还搜不到这么现成的 调用MySql的工具mysqldump来实现. 类Cmd来实现调用cmd命令, ...

  5. JS脚本语言(全称java script:网页里使用的脚本语言:非常强大的语言):基础语法

    一.注释语法 1.单行注释// 2.多行注释/**/ 二.语法输出 1.alert(信息):弹出信息 2.confirm(信息):弹出一个和用户交互的对话框 3.prompt(信息):弹出一个可以让用 ...

  6. KVO底层实现原理,仿写KVO

    这篇文章简单介绍苹果的KVO底层是怎么实现的,自己仿照KVO的底层实现,写一个自己的KVO监听 #pragma mark--KVO底层实现 第一步:新建一个Person类继承NSObject Pers ...

  7. PHP - curl实现采集

    1.开启curl支持 由于php环境安装后默认是没有打开curl支持的,需修改php.ini文件,找到;extension=php_curl.dll,把前面的冒号去掉,重启服务即可: 2.使用curl ...

  8. python 全栈开发,Day43(python全栈11期月考题)

    python全栈11期月考题 1.常用字符串格式化有哪些?并说明他们的区别 2.请手写一个单例模式(面试题) 3.利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题) 4 ...

  9. C# oracle 日期型字段,使用参数传值时,遇到ORA-01810: format code appears twice错误

    C#操作oracle数据库时,发现使用to_date('2014-01-03 18:00:00','yyyy-mm-dd hh:MM:ss')时,会出现ORA-01810: format code a ...

  10. Docker容器的自动化监控实现

    本文由  网易云 发布. 近年来容器技术不断成熟并得到应用.Docker作为容器技术的一个代表,目前也在快速发展中,基于 Docker的各种应用也正在普及,与此同时 Docker对传统的运维体系也带来 ...