java往elasticsearch(ES)中写入数据
2017-12-15 15:08
453 查看
elasticsearch(ES)好处如下:
Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
分布式的实时文件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
使用ES不仅可以方便高效的存储大量数据,更重要的是可以进行全文搜索,这个是mysql等关系数据库所不具备的.
那么怎么使用ES呢,
首先你要了解ES,这个是ES特别好的中文版教程:ES中文版教程
一,ES的基本知识
大家都知道,mysql数据库可以分为:数据库(database) ->表(table) -> 行(row)->列(column),这样就可以唯一的记录一个数据了
同样为了方便查询,ES也分为:索引(index)->类型(type)->文档(document)->字段(field)
具体的对应规则如下:
Relational DB -> Database-> Table -> Row -> Column
Elasticsearch -> Index -> Type -> Document-> Field
往mysql中写数据之前,需要创建表(table),同样在ES里也需要创建表,不过在ES里叫做创建mapping(映射),关于创建mapping的具体内容大家可以看es的中文文档,
下面给出一个mapping 的例子,大家可以一窥究竟
"soft_list": {//index的名称
"mappings": {
"soft": {//type的名称
"_ttl": {
"enabled": false
},
"dynamic": "false",
"_all": {
"enabled": false
},
"properties": {
"detailPageUrl": {//具体字段,即field
"analyzer": "ik",
"type": "string"//字段类型
},
"softwareName": {
"analyzer": "ik",//分词类型
"type": "string"
},
"companyName": {
"analyzer": "ik",
"type": "string"
},
"downloadUrl": {
"analyzer": "ik",
"type": "string"
},
"id": {
"type": "integer"
},
"softwareSize": {
"analyzer": "ik",
"type": "string"
},
"payOrFree": {
"analyzer": "ik",
"type": "string"
},
"softwareVer": {
"analyzer": "ik",
"type": "string"
}
}
}
}
}至此,整个准备工作已经完成,接下来就要用java往ES里写入数据
二,写入数据
1,第一步需要创建和ES中mapping中字段一样的javaBean,这一步和mysql中写入数据一样,
/**
* @author 李光光(编码小王子)
* @date 2017年9月1日 下午2:35:07
* @version 1.0
*/
public class SoftwareInfoEs {
private String companyName;//公司名称
private Integer id;//相当于id
private String softwareName;//软件名
private String downloadUrl;//下载地址
private String detailPageUrl;//软件详情页地址
private String softwareSize;//软件大小
private String softwareVer;//软件大小
private String payOrFree;//是否免费
private String score;//查询出来的得分
//set,get方法
}
2,创建写入ES的接口EsJavaClient
public interface EsJavaClient {
<T> void put(T object,Class<T> klass);
}
3,EsJavaClient的实现类如下:
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EsJavaClientImpl implements EsJavaClient {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
private Client client;
private String serverName;//es服务器地址
private int port;//es服务器端口
private String clusterName;//es服务器名称
private volatile Map<String, Pair<String, String>> indexInfos;
@Override
public <T> void put(T object,Class<T> klass) {
String index = getIndex(klass);
String type = getType(klass);
try {
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(object);
ActionFuture<IndexResponse> future = client.index(new IndexRequest(index, type).source(jsonStr));
IndexResponse response = future.get();//此处会阻塞
logger.info(response.getId());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
//获取注入的参数
public void setIndexInfos(Map<String, Pair<String, String>> indexInfos) {
this.indexInfos = indexInfos;
}
public Map<String, Pair<String, String>> getIndexInfos(){
return this.indexInfos;
}
//获取index
private String getIndex(Class klass){
return indexInfos.get(klass.getName()).fst;
}
//获取type
private String getType(Class klass) {
return indexInfos.get(klass.getName()).snd;
}
//set,get方法
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
}
3,配置ES的service_bean.xml文件
<bean id="SoftwareInfoIndexType" class="com.sun.tools.javac.util.Pair">
<constructor-arg><value>你的index</value></constructor-arg>
<constructor-arg><value>你的type</value></constructor-arg>
</bean>
<bean id="esJavaClient" class="com.server.web.service.es.EsJavaClientImpl" init-method="initClient">
<property name="serverName" value="${esclient.serverName}"></property>
<property name="port" value="${esclient.port}"></property>
<property name="clusterName" value="${esclient.clusterName}"></property>
<property name="indexInfos">
<map>
<entry key="com.server.web.domain.SoftwareInfoEs" value-ref="SoftwareInfoIndexType"></entry&
4000
gt;
</map>
</property>
</bean>
这样就可以写入到ES了,接下来会陆续更新,怎么从ES查询数据,修改ES中的数据等操作
Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
分布式的实时文件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
使用ES不仅可以方便高效的存储大量数据,更重要的是可以进行全文搜索,这个是mysql等关系数据库所不具备的.
那么怎么使用ES呢,
首先你要了解ES,这个是ES特别好的中文版教程:ES中文版教程
一,ES的基本知识
大家都知道,mysql数据库可以分为:数据库(database) ->表(table) -> 行(row)->列(column),这样就可以唯一的记录一个数据了
同样为了方便查询,ES也分为:索引(index)->类型(type)->文档(document)->字段(field)
具体的对应规则如下:
Relational DB -> Database-> Table -> Row -> Column
Elasticsearch -> Index -> Type -> Document-> Field
往mysql中写数据之前,需要创建表(table),同样在ES里也需要创建表,不过在ES里叫做创建mapping(映射),关于创建mapping的具体内容大家可以看es的中文文档,
下面给出一个mapping 的例子,大家可以一窥究竟
"soft_list": {//index的名称
"mappings": {
"soft": {//type的名称
"_ttl": {
"enabled": false
},
"dynamic": "false",
"_all": {
"enabled": false
},
"properties": {
"detailPageUrl": {//具体字段,即field
"analyzer": "ik",
"type": "string"//字段类型
},
"softwareName": {
"analyzer": "ik",//分词类型
"type": "string"
},
"companyName": {
"analyzer": "ik",
"type": "string"
},
"downloadUrl": {
"analyzer": "ik",
"type": "string"
},
"id": {
"type": "integer"
},
"softwareSize": {
"analyzer": "ik",
"type": "string"
},
"payOrFree": {
"analyzer": "ik",
"type": "string"
},
"softwareVer": {
"analyzer": "ik",
"type": "string"
}
}
}
}
}至此,整个准备工作已经完成,接下来就要用java往ES里写入数据
二,写入数据
1,第一步需要创建和ES中mapping中字段一样的javaBean,这一步和mysql中写入数据一样,
/**
* @author 李光光(编码小王子)
* @date 2017年9月1日 下午2:35:07
* @version 1.0
*/
public class SoftwareInfoEs {
private String companyName;//公司名称
private Integer id;//相当于id
private String softwareName;//软件名
private String downloadUrl;//下载地址
private String detailPageUrl;//软件详情页地址
private String softwareSize;//软件大小
private String softwareVer;//软件大小
private String payOrFree;//是否免费
private String score;//查询出来的得分
//set,get方法
}
2,创建写入ES的接口EsJavaClient
public interface EsJavaClient {
<T> void put(T object,Class<T> klass);
}
3,EsJavaClient的实现类如下:
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EsJavaClientImpl implements EsJavaClient {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
private Client client;
private String serverName;//es服务器地址
private int port;//es服务器端口
private String clusterName;//es服务器名称
private volatile Map<String, Pair<String, String>> indexInfos;
@Override
public <T> void put(T object,Class<T> klass) {
String index = getIndex(klass);
String type = getType(klass);
try {
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(object);
ActionFuture<IndexResponse> future = client.index(new IndexRequest(index, type).source(jsonStr));
IndexResponse response = future.get();//此处会阻塞
logger.info(response.getId());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
//获取注入的参数
public void setIndexInfos(Map<String, Pair<String, String>> indexInfos) {
this.indexInfos = indexInfos;
}
public Map<String, Pair<String, String>> getIndexInfos(){
return this.indexInfos;
}
//获取index
private String getIndex(Class klass){
return indexInfos.get(klass.getName()).fst;
}
//获取type
private String getType(Class klass) {
return indexInfos.get(klass.getName()).snd;
}
//set,get方法
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
}
3,配置ES的service_bean.xml文件
<bean id="SoftwareInfoIndexType" class="com.sun.tools.javac.util.Pair">
<constructor-arg><value>你的index</value></constructor-arg>
<constructor-arg><value>你的type</value></constructor-arg>
</bean>
<bean id="esJavaClient" class="com.server.web.service.es.EsJavaClientImpl" init-method="initClient">
<property name="serverName" value="${esclient.serverName}"></property>
<property name="port" value="${esclient.port}"></property>
<property name="clusterName" value="${esclient.clusterName}"></property>
<property name="indexInfos">
<map>
<entry key="com.server.web.domain.SoftwareInfoEs" value-ref="SoftwareInfoIndexType"></entry&
4000
gt;
</map>
</property>
</bean>
这样就可以写入到ES了,接下来会陆续更新,怎么从ES查询数据,修改ES中的数据等操作
相关文章推荐
- elasticsearch__1__java操作之连接es,创建Mapping,保存数据
- java中IO流的学习笔记(1、字节流写入数据)
- Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)
- java 非缓冲与缓冲数据写入比较
- java将数据写入xml与读取xml文件数据
- logstash 向elasticsearch写入数据,如何指定多个数据template
- Java客户端连接elasticsearch5.5.3实现数据搜索(基于xpack安全管理)
- Java使用URLConnection写入和读取数据
- java连接mysql批量写入数据
- Java POI 导出Oracle数据表写入Excel文件(Excel2007 xlsx)
- 大数据学习[11]:JAVA连接elasticsearch5.6.1操作|问题|分析
- Java 使用DataInputStream将数据写入文件,使用FileReader读取演示
- ELK研究(一):elasticsearch java api接口操作ES集群 ---TransportClient的使用介绍 bulk批量提交数据
- java多线程向数据库写入数据
- hive 数据写入es
- Java对Oracle中Clob类型数据的读取和写入
- Elasticsearch通过JAVA创建索引、Mapping以及数据的增删该查操作
- java将数据写入excel
- java 强制将数据写入磁盘
- Windows下使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示