java操作ElasticSearch(es)进行增删查改操作x

时间:2022-06-22 11:45:06 浏览量:

 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