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

Springboot整合elasticSearch的官方API实例

前言:在上一篇博客中,我介绍了从零开始安装ElasticSearch,es是可以理解为一个操作数据的中间件,可以把它作为数据的存储仓库来对待,它具备强大的吞吐能力和计

前言:在上一篇博客中,我介绍了从零开始安装ElasticSearch,es是可以理解为一个操作数据的中间件,可以把它作为数据的存储仓库来对待,它具备强大的吞吐能力和计算能力,其基于Lucene服务器开发,在搜索领域具有统治般的地位。平时可以通过命令来执行语句来查询ES,但是在实际的开发中,还是以使用API居多,关于ES的第三方框架有很多,比如BBOSS、spring也对其进行封装叫做spring-elasticsearch-data,本篇博客,我们就来聚焦Spring的官方API,来做一个基本的demo实现api来操作Es(elasticsearch的简称)

本篇博客的目录

一:ElasticSearch的基本概念

二:ElasticSearch5.2.2的安装

三:ElasticSearch的官方API与Demo实现

四:总结

一:ElasticSearch的基本概念

1.1:索引 index

 索引是ES存储数据的基本顶层单元目录.它好比就是关系型数据库中的数据库,是存储数据的地方。当搜索数据的时候,会直接从索引中查取,注意这里要与关系型数据的中的索引区分,他们是完全不同的概念。index的名字必须是小写,不能包含逗号、下划线或者大写字母

1.2:类型 type

type表示一类或者一种事物的抽象,在关系型数据库中我们经常将一类结构相似的数据放在一个表里,而在elasticsearch中,使用相同类型的type表示相同的一类事物,它相当于关系型数据库中的表(table),用于描述文档中的各个字段的定义。每个type都有自己的映射(mapping)或者结构定义。type的名字可以是大写或者小写,不能包含下划线或者逗号。

1.3:文档 document

document是index中的单条数据序列化成的json格式的数据,它以唯一id(_id)存储在ES中,相当于关系表的数据行,存储数据的载体,包含一个或多个存有数据的字段;

·字段(Field):文档的一个Key/Value对;

·词(Term):表示文本中的一个单词;

·标记(Token):表示在字段中出现的词,由该词的文本、偏移量(开始和结束)以及类型组成

1.4:Node 与 Cluster

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

1.5:与mysql进行比较

 二:ElasticSearch5.2.2的安装

   上一篇博客已经介绍了ES2.0版本的安装,这篇就不再赘述了。不过我还是决定说一些在安装过程中的坑,安装ES的坑确实很多,楼主分别安装了2.0版本,5.5.2版本,5.2.2版本,还用docker安装了,但是因为docker玩的不够熟练,在配置文件上更改还是出了很多问题,最终还是靠传统的安装方式解决的。接下来就说说ES安装过程中的一些坑以及主要的点:

2.1:cannot allocate memory

这个是因为ES无法获取到足够的内存,解决办法就是,修改elasticseach的config目录下的jvm.options,ES默认的大小是1G,最好修改成2的整数倍的容量,具体依自己的内存而定,我修改的是256m

2.2:Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.   

无法以root用户启动,ES直接以root用户是无法启动的,解决办法很简单,就是建立一个ES的专用的组和用户:

groupadd elasticsearchgroup
useradd elasticsearchgroup
-g elasticsearch -p elasticsearch
chown -R elasticsearchgroup:elasticsearch elasticsearch-5.2.2

这里是先建立了一个elasticsearch的组,然后再添加elasticsearch这个用户,密码也是elasticsearch,再给ES的安装目录添加权限

2.3:ERROR: bootstrap checks failed max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决办法就是修改系统的修改配置sysctl.conf最大文件交换数量:

vi.sysctl.conf
vm.max_map_count=655360
sysctl -p

2.4: org.elasticsearch.client.transport.NoNodeAvailableException

这个错误,是后台在连接APi出现的错误,为了解决这个问题,我花了很久(下面会说到版本号的问题),还有需要更改一下配置:

首先是编辑config目录下的 elasticsearch.yml文件:

这里的host要把#号打开,然后写上自己的外网IP的地址,还有cluster.name的名字也要记住,它在配置ES中需要用到

三:ElasticSearch的官方API与Demo实现

 3.1.1:引入TransPort5.2.2 

这里必须注意引入5.2.2版本,因为我服务上安装的ES就是5.2.2版本。ES官方API众多,每个版本之间不是互相兼容的,如果引入的版本对应,会报一个错误:

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available.(这个错误折磨了我很久,所以一定要以自己的服务器上的版本为准,引入netty和elasticsearch、transport的版本互相对应)

org.elasticsearch.plugintransport-netty4-client5.2.2org.elasticsearchelasticsearch5.2.2org.elasticsearch.clienttransport5.2.2

3.1.2:springboot配置ES

新建一个类叫做ESconfig,主要是配置ES服务器的IP和端口(注意这里是9300而不是9200),9300是ES的TCP服务端口,然后实例化客户端;

package com.wyq.elasticsearch.easticsearchtest.config;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.net.InetAddress;
import java.net.UnknownHostException;@Configuration
public class ESConfig {@Beanpublic TransportClient client() throws UnknownHostException {// 9300是es的tcp服务端口final String host = "176.122.132.220";InetSocketTransportAddress node = new InetSocketTransportAddress(InetAddress.getByName(host),9300);// 设置es节点的配置信息Settings settings = Settings.builder().put("cluster.name", "application").build();// 实例化es的客户端对象TransportClient client = new PreBuiltTransportClient(settings);client.addTransportAddress(node);return client;}
}

 3.1.3:添加index

如果在ES里面添加一个index,我们需要以下命令,解释以下就是指定数据的index和type,在里面在指定fieldname

curl -X PUT 'ip:port/index/type/id’ -d '
{“filedname”: “xxx”
}
'

ES提供了同等的API来供我们使用,按照下面的例子,我们将会添加一个index叫做animal,type叫做person的数据,并通过Springboot注入TransPortClient,然后用MVC来获取请求参数,交给ES的api去处理:XContentFactory.jsonBuilder()去拼接不同的json字符串,用client去处理:

@RestController
public class ElasticSearchDemoController {@Autowiredprivate TransportClient client;public static final String index = "product";public static final String type = "person";/*** 添加一个人的数据** @param name 名字* @param sex 性别* @param message 说明* @param job 工作* @param onlyMark 唯一标志* @return*/@PostMapping("/es/add")public ResponseEntity add(@RequestParam("name") String name,@RequestParam("sex") int sex,@RequestParam("message") String message,@RequestParam("job") String job,@RequestParam("onlyMark") int onlyMark) {try {// 将参数build成一个json对象XContentBuilder content = XContentFactory.jsonBuilder().startObject().field("uniqueId", onlyMark).field("name", name).field("sex", sex).field("message", message).field("job", job).endObject();IndexResponse response = client.prepareIndex(index, type).setSource(content).get();return ResponseEntity.getSuccess(response.getResult()+""+response.getId(), HttpStatus.OK.value());} catch (Exception e) {e.printStackTrace();return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value());}}
}

3.1.4:查询index

通过id去查询,然后通过client(TransPortClient)的prepareGet方法去查询,最后返回一个GetResponse结果然后获取它的source结果:

/*** 按id查询** @param id* @return*/@GetMapping("/es/get")public ResponseEntity searchById(@RequestParam("id") String id) {if (id.isEmpty()) {return new ResponseEntity(HttpStatus.NOT_FOUND.value());}// 通过索引、类型、id向es进行查询数据GetResponse response = client.prepareGet(index, type, id).get();if (!response.isExists()) {return new ResponseEntity(HttpStatus.NOT_FOUND.value());}return ResponseEntity.getSuccess(response.getSource(), HttpStatus.OK.value());}

3.1.5:删除index

同样删除index,也是通过id来匹配的,id是唯一标志,然后交给TransPort的prepareDelete方法去删除

/*** 按id删除数据** @param id* @return*/@GetMapping("/es/delete")public ResponseEntity delete(@RequestParam("id") String id) {DeleteResponse response = client.prepareDelete(index, type, id).get();return ResponseEntity.getSuccess(response.getResult(), HttpStatus.OK.value());}

3.1.6:更新index

通过获取更新的内容,然后交给TransPort的update方法去更新需要更新的字段,最终返回更新的内容:

/*** 根据文档id更新某个文档的数据** @param uniqueId* @param name* @param sex* @param message* @param job* @return*/@PutMapping("/es/update")public ResponseEntity update(@RequestParam("id") String id,@RequestParam(value = "name", required = false) String name,@RequestParam(value = "sex", required = false) Integer sex,@RequestParam(value = "message", required = false) String message,@RequestParam(value = "job", required = false) String job,@RequestParam(value = "uniqueId", required = false) Integer uniqueId){UpdateRequest update = new UpdateRequest(index, type, id);try {XContentBuilder builder = XContentFactory.jsonBuilder().startObject();if (Objects.nonNull(name)) {builder.field("name", name);}if (Objects.nonNull(sex)) {builder.field("sex", sex);}if (Objects.nonNull(message)) {builder.field("message", message);}if (Objects.nonNull(job)) {builder.field("job", job);}if (Objects.nonNull(uniqueId)){builder.field("uniqueId",uniqueId);}builder.endObject();update.doc(builder);UpdateResponse response = client.update(update).get();return ResponseEntity.getSuccess(response.getResult(), HttpStatus.OK.value());} catch (Exception e) {e.printStackTrace();return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value());}}

 3.2:测试

3.2.1:打开postman,然后我们来先来添加一个index,添加一些属性,后台提示成功:我们在去ES中查询一下:

3.2.2:在服务器中打开,然后输入查询所有index的命令,查询animal这个index对应的数据,可以看到我们的数据已经顺利添加:

3.2.3:查询index

上面的方式是通过命令的方式来查询的,我们再来通过程序来测试查询index,可以看到数据查询到了:

3.2.4:更新index

后台通过传入的字段对指定有值的数据进行更新,在这里我们更新message:

 

 3.2.5:为了验证我们的更改是否生效,我们再查询一下这个index,发现message已经变化了:

3.2.6:删除index

 

 3.2.7:同样我们在验证一下是否删除成功,可以看出total为0,也代表没有数据了:

 

四:总结

    碍于篇幅,本片博文就介绍到这里,主要是讲述了ElasticSearch的官方API的使用,以及搭建ES中的一些坑,为了解决这些坑,我在下班之余耗费了好几个星期研究这些问题,ES的版本众多,一定要注意版本的选择。本篇博文适合入门级别,没有介绍ES的高级特性,关于它本身具有很多高端特性,实乃搜索利器,我们不能把它作为数据库来看待,实际上它本身可以理解为一个搜索引擎,有着丰富的使用场景,"它远大于数据库,存储只是它的一个细小的功能",好了,希望本篇博客可以帮助到你。

本篇博客的代码分享:链接:https://pan.baidu.com/s/1k-E15_EtHArG3iYi_3wc9A  密码:0nbp

如果关于本篇博客有任何问题,请加群:618626589

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

                http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

 

 

转:https://www.cnblogs.com/wyq178/p/10989638.html



推荐阅读
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • es的分布式原理?es是如何实现分布式的?
    Elasticsearch设计的理念是分布式搜索引擎,底层其实是基于lucene。核心思 ... [详细]
author-avatar
心茈天天开心启q
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有