java 操作 ElasticSearch (es )进行增删查改操作 ElasticSearch(名称太长,后面简称 ES)作为一个搜索引擎,目前可谓是如日中天,几乎和 solr 齐驾并驱。关于他能做什么,跟云计算有什么关系,在此不再描述。但是 ES 的官方文档,特别是关于 java 的客户端文档,真是少的可怜,甚至连个完整的增删改的示例都没有。在此,我就献丑了。
在开始讲解之前,还是先做个铺垫,为了能够有一个可以索引的模型,我们自定义了一个模型,暂时起个名称叫 LogModel 吧,这个模型有各种数据类型,int,long,String,list,但千万不要认为这是跟记录日志有关的一个模型。作为索引的一个最简单模型。代码如下:
Java 代码
1 ArrayList;
2 List;
3 Random;
4 import java.util.UUID;
5 /**
6
瞎编的一个模型,跟日志基本没有关系
7
* @author donlian
8
*/
9. public class LogModel {
10//主 ID
11private long id;
12//次 ID
13private int subId;
14/**
15系统名称
16*/
17systemName;
18private String host;
19
20//日志描述
21String desc;
22rivate List<Integer> catIds;
23public LogModel(){
24Random random = new Random();
25this.id = Math.abs(random.nextLong());
26.
int subId = Math.abs(random.nextInt());
27this.subId = subId;
28List<Integer> list = new ArrayList<Integer>(5);
29for(int i=0;i<5;i++){
30
list.add(Math.abs(random.nextInt()));
31}
32catIds = list;
33systemName = subId%1 == 0?"oa":"cms";
34host = subId%1 == 0?"10.0.0.1":"10.2.0.1";
35
this.desc = "中文" + UUID.randomUUID().toString();
36}
37.
public LogModel(long id,int subId,String sysName,String host,String desc,List<Integer> catIds){
38id = id;
39ubId = subId;
40systemName = sysName;
41host = host;
42desc = desc;
43
this.catIds = catIds;
44
}
45...//省去 get,set 方法
46. }
同时,因为 ES 在索引的时候,一般都用 json 格式,因此,使用 jackson 定义了一个将对象转化成 json 的工具类,也很简单,代码:
Java 代码
1 public class ESUtils {
2
private static ObjectMapper objectMapper = new ObjectMapper();
3
public static String toJson(Object o){
4
try {
5
return objectMapper.writeValueAsString(o);
6
} catch (JsonProcessingException e) {
7
e.printStackTrace();
8
}
9.
return "";
10
}
11. }
在开始进行操作 ES 服务器之前,我们必须得获得 ES 的 API,简单介绍一下 ES 操作服务器的两种方式,一种是使用 Node 方式,即本机也启动一个 ES,然后跟服务器的 ES 进行通信,这个 node 甚至还能存储(奇怪,一般需要这样的方式
吗?),另一种,就是下面我介绍的这一种,通过一个对象使用 http 协议跟服务器进行交互。
获得一个 ES 客户端 API 的代码如下:
Java 代码
1 Settings settings = ImmutableSettings.settingsBuilder()
2
//指定集群名称
3
.put("cluster.name", "elasticsearch")
4
//探测集群中机器状态
5
.put("client.transport.sniff", true).build();
6
/*
7.
* 创建客户端,所有的操作都由客户端开始,这个就好像是 JDBC 的Connection 对象
8
* 用完记得要关闭
9.
*/
10Client client = new TransportClient(stings)
11.
.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
Client 对象,可以理解为数据库的 Connection 对象。好了,准备工作完成,下面就开始增删改查。
Index( 增加)
ES 里面的增加对象不叫什么 add,save 等,叫 index。但无论叫什么名称,反正就是向 ES 服务器里面加数据。上面说过一个对象转 json 的工具类,其实 ES 的 API中,是自带构建 json 的工具类的。
Java 代码
1 action.index.IndexResponse;
2 Client;
3 lient.transport.TransportClient;
4 ImmutableSettings;
5 settings.Settings;
6 import org.elasticsearch.common.transport.InetSocketTransportAddress;
7
8 ESUtils;
9. import com.donlianli.es.model.LogModel;
10/**
11.
* 向 ES 添加索引对象
12@author donlian
13*/
14public class IndexTest {
15public static void main(String[] argv){
16Settings settings = ImmutableSettings.settingsBuilder()
17//指定集群名称
18.put("cluster.name", "elasticsearch")
19//探测集群中机器状态
20
.put("client.transport.sniff", true).build();
21/*
22.
* 创建客户端,所有的操作都由客户端开始,这个就好像是 JDBC 的Connection 对象
23用完记得要关闭
24*/
25Client client = new TransportClient(stings)
26.
.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
27String json = ESUtils.toJson(new LogModel());
28//在这里创建我们要索引的对象
29IndexResponse response = client.prepareIndex("twitter", "tweet")
30//必须为对象单独指定 ID
31Id("1")
32setSource(json)
33execute()
34
.actionGet();
35//多次 index 这个版本号会变
36System.out.println("response.version():"+response.version());
37
client.close();
38
}
39. }
运行这个代码,就向 ES 插入了一条数据,你运行两遍,还是一条。ES 根据你设置的 ID 来设置对象,如果没有则插入,有则更新。每更新一次,对应的 version加 1. 好了,在次,使用以下命令,应该能够查询到一条记录了。
Java 代码
1. curl -XGET "http://localhost:9200/twitter/tweet/1"
delete( 删除)
有了增加的例子,删除的例子也就好写了。增加是 prepareIndex,删除是prepareDelete,查询就是 PrepareGet。
代码如下:
Java 代码
1 action.delete.DeleteResponse;
2 Client;
3 lient.transport.TransportClient;
4 ImmutableSettings;
5 settings.Settings;
6 import org.elasticsearch.common.transport.InetSocketTransportAddress;
7
8 import com.donlianli.es.ESUtils;
9.
10public class DeleteTest {
11public static void main(String[] argv){
12Settings settings = ImmutableSettings.settingsBuilder()
13//指定集群名称
14.put("cluster.name", "elasticsearch")
15//探测集群中机器状态
16
.put("client.transport.sniff", true).build();
17/*
18.
* 创建客户端,所有的操作都由客户端开始,这个就好像是 JDBC 的Connection 对象
19用完记得要关闭
20*/
21Client client = new TransportClient(stings)
22.
.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
23//在这里创建我们要索引的对象
24DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
25
.execte().actionGet();
26response.getId());
27
System.out.println(ESUtils.toJson(response.getHeaders()));
28
}
29. }
GET( 查询)
Java 代码
1 action.get.GetResponse;
2 Client;
3 lient.transport.TransportClient;
4 ImmutableSettings;
5 settings.Settings;
6 import org.elasticsearch.common.transport.InetSocketTransportAddress;
7
8 public class GetTest {
9.
public static void main(String[] argv){
10Settings settings = ImmutableSettings.settingsBuilder()
11//指定集群名称
12.put("cluster.name", "elasticsearch")
13//探测集群中机器状态
14
.put("client.transport.sniff", true).build();
15/*
16.
* 创建客户端,所有的操作都由客户端开始,这个就好像是 JDBC 的Connection 对象
17用完记得要关闭
18*/
19Client client = new TransportClient(stings)
20.
.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
21//在这里创建我们要索引的对象
22GetResponse response = client.prepareGet("twitter", "tweet", "1")
23
.execte().actionGet();
24Id():"+response.getId());
25.
System.out.println("response.getSourceAsString():"+response.getSourceAsString());
26
}
27. }
好了,增删改查的代码写完。至于搜索,那是一个比较深入的话题,我也在慢慢探索。我时间我会继续写下去。
相关热词搜索: 操作 增删 java