热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

es增删改查java代码_java操作ElasticSearch(es)进行增删查改操作

ElasticSearch(名称太长,后面简称ES)作为一个搜索引擎,目前可谓是如日中天,几乎和solr齐驾并驱。关于他能做什么ÿ

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

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

Java代码  3939d3710641708a5c8bd42373efe525.png

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.UUID;

/**

* 瞎编的一个模型,跟日志基本没有关系

* @author donlian

*/

public class LogModel {

//主ID

private long id;

//次ID

private int subId;

/**

* 系统名称

*/

private String systemName;

private String host;

//日志描述

private String desc;

private List catIds;

public LogModel(){

Random random = new Random();

this.id = Math.abs(random.nextLong());

int subId = Math.abs(random.nextInt());

this.subId = subId;

List list = new ArrayList(5);

for(int i&#61;0;i<5;i&#43;&#43;){

list.add(Math.abs(random.nextInt()));

}

this.catIds &#61; list;

this.systemName &#61; subId%1 &#61;&#61; 0?"oa":"cms";

this.host &#61; subId%1 &#61;&#61; 0?"10.0.0.1":"10.2.0.1";

this.desc &#61; "中文" &#43; UUID.randomUUID().toString();

}

public LogModel(long id,int subId,String sysName,String host,String desc,List catIds){

this.id &#61; id;

this.subId &#61; subId;

this.systemName &#61; sysName;

this.host &#61; host;

this.desc &#61; desc;

this.catIds &#61; catIds;

}

...//省去get,set方法

}

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

Java代码  3939d3710641708a5c8bd42373efe525.png

public class ESUtils {

private static ObjectMapper objectMapper &#61; new ObjectMapper();

public static String toJson(Object o){

try {

return objectMapper.writeValueAsString(o);

} catch (JsonProcessingException e) {

e.printStackTrace();

}

return "";

}

}

在开始进行操作ES服务器之前&#xff0c;我们必须得获得ES的API&#xff0c;简单介绍一下ES操作服务器的两种方式&#xff0c;一种是使用Node方式&#xff0c;即本机也启动一个ES&#xff0c;然后跟服务器的ES进行通信&#xff0c;这个node甚至还能存储(奇怪&#xff0c;一般需要这样的方式吗&#xff1f;)&#xff0c;另一种&#xff0c;就是下面我介绍的这一种&#xff0c;通过一个对象使用http协议跟服务器进行交互。

获得一个ES客户端API的代码如下&#xff1a;

Java代码  3939d3710641708a5c8bd42373efe525.png

Settings settings &#61; ImmutableSettings.settingsBuilder()

//指定集群名称

.put("cluster.name", "elasticsearch")

//探测集群中机器状态

.put("client.transport.sniff", true).build();

/*

* 创建客户端&#xff0c;所有的操作都由客户端开始&#xff0c;这个就好像是JDBC的Connection对象

* 用完记得要关闭

*/

Client client &#61; new TransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

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

Index(增加)

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

Java代码  3939d3710641708a5c8bd42373efe525.png

import org.elasticsearch.action.index.IndexResponse;

import org.elasticsearch.client.Client;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.settings.ImmutableSettings;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.InetSocketTransportAddress;

import com.donlianli.es.ESUtils;

import com.donlianli.es.model.LogModel;

/**

* 向ES添加索引对象

* &#64;author donlian

*/

public class IndexTest {

public static void main(String[] argv){

Settings settings &#61; ImmutableSettings.settingsBuilder()

//指定集群名称

.put("cluster.name", "elasticsearch")

//探测集群中机器状态

.put("client.transport.sniff", true).build();

/*

* 创建客户端&#xff0c;所有的操作都由客户端开始&#xff0c;这个就好像是JDBC的Connection对象

* 用完记得要关闭

*/

Client client &#61; new TransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

String json &#61; ESUtils.toJson(new LogModel());

//在这里创建我们要索引的对象

IndexResponse response &#61; client.prepareIndex("twitter", "tweet")

//必须为对象单独指定ID

.setId("1")

.setSource(json)

.execute()

.actionGet();

//多次index这个版本号会变

System.out.println("response.version():"&#43;response.version());

client.close();

}

}

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

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

Java代码  3939d3710641708a5c8bd42373efe525.png

curl -XGET &#39;http://localhost:9200/twitter/tweet/1&#39;

delete(删除)

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

代码如下&#xff1a;

Java代码  3939d3710641708a5c8bd42373efe525.png

import org.elasticsearch.action.delete.DeleteResponse;

import org.elasticsearch.client.Client;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.settings.ImmutableSettings;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.InetSocketTransportAddress;

import com.donlianli.es.ESUtils;

public class DeleteTest {

public static void main(String[] argv){

Settings settings &#61; ImmutableSettings.settingsBuilder()

//指定集群名称

.put("cluster.name", "elasticsearch")

//探测集群中机器状态

.put("client.transport.sniff", true).build();

/*

* 创建客户端&#xff0c;所有的操作都由客户端开始&#xff0c;这个就好像是JDBC的Connection对象

* 用完记得要关闭

*/

Client client &#61; new TransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

//在这里创建我们要索引的对象

DeleteResponse response &#61; client.prepareDelete("twitter", "tweet", "1")

.execute().actionGet();

System.out.println(response.getId());

System.out.println(ESUtils.toJson(response.getHeaders()));

}

}

GET(查询)

Java代码  3939d3710641708a5c8bd42373efe525.png

import org.elasticsearch.action.get.GetResponse;

import org.elasticsearch.client.Client;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.settings.ImmutableSettings;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.InetSocketTransportAddress;

public class GetTest {

public static void main(String[] argv){

Settings settings &#61; ImmutableSettings.settingsBuilder()

//指定集群名称

.put("cluster.name", "elasticsearch")

//探测集群中机器状态

.put("client.transport.sniff", true).build();

/*

* 创建客户端&#xff0c;所有的操作都由客户端开始&#xff0c;这个就好像是JDBC的Connection对象

* 用完记得要关闭

*/

Client client &#61; new TransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

//在这里创建我们要索引的对象

GetResponse response &#61; client.prepareGet("twitter", "tweet", "1")

.execute().actionGet();

System.out.println("response.getId():"&#43;response.getId());

System.out.println("response.getSourceAsString():"&#43;response.getSourceAsString());

}

}

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



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • javajigsaw2015年12月1日,星期二,在OpenJDK邮件列表中,MarkReinhold确认了许多人的期望:J ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
Android代码
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有