有时间是要了解一下ES这个东西的~

-------------------------------------------------------------------------------------------------

 
ElasticSearch(名称太长,后面简称ES)作为一个搜索引擎,目前可谓是如日中天,几乎和solr齐驾并驱。关于他能做什么,跟云计算有什么关系,在此不再描述。但是ES的官方文档,特别是关于java的客户端文档,真是少的可怜,甚至连个完整的增删改的示例都没有。在此,我就献丑了。

在开始讲解之前,还是先做个铺垫,为了能够有一个可以索引的模型,我们自定义了一个模型,暂时起个名称叫LogModel吧,这个模型有各种数据类型,int,long,String,list,但千万不要认为这是跟记录日志有关的一个模型。作为索引的一个最简单模型。代码如下:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Random;
  4. import java.util.UUID;
  5. /**
  6. * 瞎编的一个模型,跟日志基本没有关系
  7. * @author donlian
  8. */
  9. public class LogModel {
  10. //主ID
  11. private long id;
  12. //次ID
  13. private int subId;
  14. /**
  15. * 系统名称
  16. */
  17. private String systemName;
  18. private String host;
  19. //日志描述
  20. private String desc;
  21. private List<Integer> catIds;
  22. public LogModel(){
  23. Random random = new Random();
  24. this.id = Math.abs(random.nextLong());
  25. int subId = Math.abs(random.nextInt());
  26. this.subId = subId;
  27. List<Integer> list = new ArrayList<Integer>(5);
  28. for(int i=0;i<5;i++){
  29. list.add(Math.abs(random.nextInt()));
  30. }
  31. this.catIds = list;
  32. this.systemName = subId%1 == 0?"oa":"cms";
  33. this.host = subId%1 == 0?"10.0.0.1":"10.2.0.1";
  34. this.desc = "中文" + UUID.randomUUID().toString();
  35. }
  36. public LogModel(long id,int subId,String sysName,String host,String desc,List<Integer> catIds){
  37. this.id = id;
  38. this.subId = subId;
  39. this.systemName = sysName;
  40. this.host = host;
  41. this.desc = desc;
  42. this.catIds = catIds;
  43. }
  44. ...//省去get,set方法
  45. }

同时,因为ES在索引的时候,一般都用json格式,因此,使用jackson定义了一个将对象转化成json的工具类,也很简单,代码:

  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的代码如下:

  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. */
  10. Client client = new TransportClient(settings)
  11. .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

Client对象,可以理解为数据库的Connection对象。好了,准备工作完成,下面就开始增删改查。

Index(增加)

ES里面的增加对象不叫什么add,save等,叫index。但无论叫什么名称,反正就是向ES服务器里面加数据。上面说过一个对象转json的工具类,其实ES的API中,是自带构建json的工具类的。

  1. import org.elasticsearch.action.index.IndexResponse;
  2. import org.elasticsearch.client.Client;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.ImmutableSettings;
  5. import org.elasticsearch.common.settings.Settings;
  6. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  7. import com.donlianli.es.ESUtils;
  8. import com.donlianli.es.model.LogModel;
  9. /**
  10. * 向ES添加索引对象
  11. * @author donlian
  12. */
  13. public class IndexTest {
  14. public static void main(String[] argv){
  15. Settings settings = ImmutableSettings.settingsBuilder()
  16. //指定集群名称
  17. .put("cluster.name", "elasticsearch")
  18. //探测集群中机器状态
  19. .put("client.transport.sniff", true).build();
  20. /*
  21. * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象
  22. * 用完记得要关闭
  23. */
  24. Client client = new TransportClient(settings)
  25. .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
  26. String json = ESUtils.toJson(new LogModel());
  27. //在这里创建我们要索引的对象
  28. IndexResponse response = client.prepareIndex("twitter", "tweet")
  29. //必须为对象单独指定ID
  30. .setId("1")
  31. .setSource(json)
  32. .execute()
  33. .actionGet();
  34. //多次index这个版本号会变
  35. System.out.println("response.version():"+response.version());
  36. client.close();
  37. }
  38. }

运行这个代码,就向ES插入了一条数据,你运行两遍,还是一条。ES根据你设置的ID来设置对象,如果没有则插入,有则更新。每更新一次,对应的version加1.

好了,在次,使用以下命令,应该能够查询到一条记录了。

  1. curl -XGET 'http://localhost:9200/twitter/tweet/1'

delete(删除)

有了增加的例子,删除的例子也就好写了。增加是prepareIndex,删除是prepareDelete,查询就是PrepareGet。

代码如下:

  1. import org.elasticsearch.action.delete.DeleteResponse;
  2. import org.elasticsearch.client.Client;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.ImmutableSettings;
  5. import org.elasticsearch.common.settings.Settings;
  6. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  7. import com.donlianli.es.ESUtils;
  8. public class DeleteTest {
  9. public static void main(String[] argv){
  10. Settings settings = ImmutableSettings.settingsBuilder()
  11. //指定集群名称
  12. .put("cluster.name", "elasticsearch")
  13. //探测集群中机器状态
  14. .put("client.transport.sniff", true).build();
  15. /*
  16. * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象
  17. * 用完记得要关闭
  18. */
  19. Client client = new TransportClient(settings)
  20. .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
  21. //在这里创建我们要索引的对象
  22. DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
  23. .execute().actionGet();
  24. System.out.println(response.getId());
  25. System.out.println(ESUtils.toJson(response.getHeaders()));
  26. }
  27. }

GET(查询)

  1. import org.elasticsearch.action.get.GetResponse;
  2. import org.elasticsearch.client.Client;
  3. import org.elasticsearch.client.transport.TransportClient;
  4. import org.elasticsearch.common.settings.ImmutableSettings;
  5. import org.elasticsearch.common.settings.Settings;
  6. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  7. public class GetTest {
  8. public static void main(String[] argv){
  9. Settings settings = ImmutableSettings.settingsBuilder()
  10. //指定集群名称
  11. .put("cluster.name", "elasticsearch")
  12. //探测集群中机器状态
  13. .put("client.transport.sniff", true).build();
  14. /*
  15. * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象
  16. * 用完记得要关闭
  17. */
  18. Client client = new TransportClient(settings)
  19. .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
  20. //在这里创建我们要索引的对象
  21. GetResponse response = client.prepareGet("twitter", "tweet", "1")
  22. .execute().actionGet();
  23. System.out.println("response.getId():"+response.getId());
  24. System.out.println("response.getSourceAsString():"+response.getSourceAsString());
  25. }
  26. }

好了,增删改查的代码写完。至于搜索,那是一个比较深入的话题,我也在慢慢探索。我时间我会继续写下去。

java操作ElasticSearch(es)进行增删查改操作的更多相关文章

  1. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  2. 利用dbutils工具实现数据的增删查改操作(dbutis入门)

    一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ...

  3. Mybatis基础配置及增删查改操作

    一.简介 平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类. 不仅如此,访问不同的表,还会 ...

  4. 在Eclipse上实现简单的JDBC增删查改操作

    在Javaweb的学习里,学到了如何完成简单的增删查改操作,在这里撰写一篇文章以便自己整理回忆. 首先要建立一些包和导入一些文件.建一些类.具体框架如图  编写Product类 public clas ...

  5. PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)

    php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...

  6. spring-boot-starter-data-elasticsearch实现es的增删查改

    首先,必须吐槽一下,springboot这个elasticsearch包对于elasticsearch的支持十分不友好,目前只支持很低版本的elasticsearch,如果有哪位大牛知道如何兼容更高版 ...

  7. elasticsearch的python增删查改实例分析

    Reference:  http://bigg.top/2015/11/29/elasticsearch%E7%9A%84python%E5%A2%9E%E5%88%A0%E6%9F%A5%E6%94 ...

  8. java代码操作solr搜索引擎的增删查改

    所需的包如图: 代码如下:package solr; import java.util.List;import java.util.Map; import org.apache.solr.client ...

  9. SSM框架-MyBatis框架数据库的增删查改操作

    话不多说,在User.xml文件中主要写一下操作数据库的sql语句,增,删,查,改是最常见的数据库操作 User.xml文件下:

随机推荐

  1. Angular 应用的外壳

    你首先需要使用 Angular CLI 来创建一个初始化的应用.随后,你将对你已经初始化的应用进行修改来让你构建出 Tour of Heroes app(英雄指南) 这个应用. 在教程的本部分,你需要 ...

  2. 2018中国大学生程序设计竞赛 - 网络选拔赛 Find Integer

    Find Integer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  3. 「雅礼集训 2017 Day5」远行

    题目链接 问题分析 要求树上最远距离,很显然就想到了树的直径.关于树的直径,有下面几个结论: 如果一棵树的直径两个端点为\(a,b\),那么树上一个点\(v\)开始的最长路径是\(v\rightarr ...

  4. sqli-labs(39)

    0X01 这关和38关一样 ?id= and =1 正确 ?id=1 and 1=2 错误 不需要闭合 构造语法 0X02 ?id=;insert into users values(,"z ...

  5. 分布式-网络通信-NIO

    目录:一.java NIO 和阻塞I/O的区别     1. 阻塞I/O通信模型     2. java NIO原理及通信模型二.java NIO服务端和客户端代码实现 一.java NIO 和阻塞I ...

  6. Eclipse的JSON文件报错解决

    有时候我们后端老哥不想写HTML,偷懒去下载个前端页面,结果里面的JSON文件老报错 虽然可以正常运行,但红X看起来就是不爽,怎么解决呢 这是因为Eclipse认为JSON文件不需要注释,所以报的编译 ...

  7. 查准率(precision)和召回率(recall)

    1.定义 查准率(precision):预测患有癌症且预测正确的人数 / 预测有多少人患有癌症 召回率(recall):预测患有癌症且预测正确的人数 / 实际有多少人患有癌症 2.关系 他俩的关系如下 ...

  8. LeetCode 18. 四数之和(4Sum)

    题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等? ...

  9. Removing jQuery from GitHub.com frontend

    Removing jQuery from GitHub.com frontend Web standards in the later years Over the years, GitHub gre ...

  10. nodejs 中的 cookie 及 session

    cookie-parser 插件:cookie解析,加密的操作 cookie-session 插件:session 的解析操作 http 是无状态的 cookie:在浏览器保存一些数据,每次向服务器发 ...