您的位置:首页 > 编程语言 > Java开发

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中的数据等操作

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA ES PUT elasticSearch
相关文章推荐