前言:在上一篇博客中,我介绍了从零开始安装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的专用的组和用户:

  1. groupadd elasticsearchgroup
  2. 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最大文件交换数量:

  1. 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的版本互相对应)

  1. <dependency>
  2. <groupId>org.elasticsearch.plugin</groupId>
  3. <artifactId>transport-netty4-client</artifactId>
  4. <version>5.2.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.elasticsearch</groupId>
  8. <artifactId>elasticsearch</artifactId>
  9. <version>5.2.2</version>
  10. </dependency>
  11.  
  12. <dependency>
  13. <groupId>org.elasticsearch.client</groupId>
  14. <artifactId>transport</artifactId>
  15. <version>5.2.2</version>
  16. </dependency>

3.1.2:springboot配置ES

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

  1. package com.wyq.elasticsearch.easticsearchtest.config;
  2. import org.elasticsearch.client.transport.TransportClient;
  3. import org.elasticsearch.common.settings.Settings;
  4. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  5. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8.  
  9. import java.net.InetAddress;
  10. import java.net.UnknownHostException;
  11.  
  12. @Configuration
  13. public class ESConfig {
  14.  
  15. @Bean
  16. public TransportClient client() throws UnknownHostException {
  17. // 9300是es的tcp服务端口
  18. final String host = "176.122.132.220";
  19. InetSocketTransportAddress node = new InetSocketTransportAddress(
  20. InetAddress.getByName(host),
  21. 9300);
  22.  
  23. // 设置es节点的配置信息
  24. Settings settings = Settings.builder()
  25. .put("cluster.name", "application").build();
  26.  
  27. // 实例化es的客户端对象
  28. TransportClient client = new PreBuiltTransportClient(settings);
  29. client.addTransportAddress(node);
  30. return client;
  31. }
  32. }

3.1.3:添加index

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

  1. curl -X PUT 'ip:port/index/type/id’ -d '
  2. {
  3. filedname”: xxx
  4. }'

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

  1. @RestController
  2. public class ElasticSearchDemoController {
  3.  
  4. @Autowired
  5. private TransportClient client;
  6.  
  7. public static final String index = "product";
  8.  
  9. public static final String type = "person";
  10.  
  11. /**
  12. * 添加一个人的数据
  13. *
  14. * @param name 名字
  15. * @param sex 性别
  16. * @param message 说明
  17. * @param job 工作
  18. * @param onlyMark 唯一标志
  19. * @return
  20. */
  21. @PostMapping("/es/add")
  22. public ResponseEntity add(@RequestParam("name") String name,
  23. @RequestParam("sex") int sex,
  24. @RequestParam("message") String message,
  25. @RequestParam("job") String job,
  26. @RequestParam("onlyMark") int onlyMark) {
  27. try {
  28. // 将参数build成一个json对象
  29. XContentBuilder content = XContentFactory.jsonBuilder()
  30. .startObject()
  31. .field("uniqueId", onlyMark)
  32. .field("name", name)
  33. .field("sex", sex)
  34. .field("message", message)
  35. .field("job", job)
  36. .endObject();
  37.  
  38. IndexResponse response = client.prepareIndex(index, type)
  39. .setSource(content)
  40. .get();
  41.  
  42. return ResponseEntity.getSuccess(response.getResult()+""+response.getId(), HttpStatus.OK.value());
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value());
  46. }
  47. }
  48. }

3.1.4:查询index

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

  1. /**
  2. * 按id查询
  3. *
  4. * @param id
  5. * @return
  6. */
  7. @GetMapping("/es/get")
  8. public ResponseEntity searchById(@RequestParam("id") String id) {
  9. if (id.isEmpty()) {
  10. return new ResponseEntity(HttpStatus.NOT_FOUND.value());
  11. }
  12. // 通过索引、类型、id向es进行查询数据
  13. GetResponse response = client.prepareGet(index, type, id).get();
  14.  
  15. if (!response.isExists()) {
  16. return new ResponseEntity(HttpStatus.NOT_FOUND.value());
  17. }
  18. return ResponseEntity.getSuccess(response.getSource(), HttpStatus.OK.value());
  19. }

3.1.5:删除index

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

  1. /**
  2. * 按id删除数据
  3. *
  4. * @param id
  5. * @return
  6. */
  7. @GetMapping("/es/delete")
  8. public ResponseEntity delete(@RequestParam("id") String id) {
  9. DeleteResponse response = client.prepareDelete(index, type, id).get();
  10. return ResponseEntity.getSuccess(response.getResult(), HttpStatus.OK.value());
  11. }

3.1.6:更新index

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

  1. /**
  2. * 根据文档id更新某个文档的数据
  3. *
  4. * @param uniqueId
  5. * @param name
  6. * @param sex
  7. * @param message
  8. * @param job
  9. * @return
  10. */
  11. @PutMapping("/es/update")
  12. public ResponseEntity update(@RequestParam("id") String id,
  13. @RequestParam(value = "name", required = false) String name,
  14. @RequestParam(value = "sex", required = false) Integer sex,
  15. @RequestParam(value = "message", required = false) String message,
  16. @RequestParam(value = "job", required = false) String job,
  17. @RequestParam(value = "uniqueId", required = false) Integer uniqueId){
  18. UpdateRequest update = new UpdateRequest(index, type, id);
  19. try {
  20. XContentBuilder builder = XContentFactory.jsonBuilder()
  21. .startObject();
  22.  
  23. if (Objects.nonNull(name)) {
  24. builder.field("name", name);
  25. }
  26. if (Objects.nonNull(sex)) {
  27. builder.field("sex", sex);
  28. }
  29. if (Objects.nonNull(message)) {
  30. builder.field("message", message);
  31. }
  32. if (Objects.nonNull(job)) {
  33. builder.field("job", job);
  34. }
  35. if (Objects.nonNull(uniqueId)){
  36. builder.field("uniqueId",uniqueId);
  37. }
  38.  
  39. builder.endObject();
  40. update.doc(builder);
  41. UpdateResponse response = client.update(update).get();
  42. return ResponseEntity.getSuccess(response.getResult(), HttpStatus.OK.value());
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value());
  46. }
  47. }

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


Springboot整合elasticSearch的官方API实例的更多相关文章

  1. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

  2. ElasticSearch(2)---SpringBoot整合ElasticSearch

    SpringBoot整合ElasticSearch 一.基于spring-boot-starter-data-elasticsearch整合 开发环境:springboot版本:2.0.1,elast ...

  3. Springboot整合ElasticSearch进行简单的测试及用Kibana进行查看

    一.前言 搜索引擎还是在电商项目.百度.还有技术博客中广泛应用,使用最多的还是ElasticSearch,Solr在大数据量下检索性能不如ElasticSearch.今天和大家一起搭建一下,小编是看完 ...

  4. springboot整合elasticsearch入门例子

    springboot整合elasticsearch入门例子 https://blog.csdn.net/tianyaleixiaowu/article/details/72833940 Elastic ...

  5. Springboot整合elasticsearch以及接口开发

    Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...

  6. SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)

    准备工作 环境准备 JAVA版本 java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121 ...

  7. Springboot整合Elasticsearch报错availableProcessors is already set to [4], rejecting [4]

    Springboot整合Elasticsearch报错 今天使用SpringBoot整合Elasticsearch时候,相关的配置完成后,启动项目就报错了. nested exception is j ...

  8. 😊SpringBoot 整合 Elasticsearch (超详细).md

    SpringBoot 整合 Elasticsearch (超详细) 注意: 1.环境搭建 安装es Elasticsearch 6.4.3 下载链接 为了方便,环境使用Windows 配置 解压后配置 ...

  9. springboot整合elasticsearch(基于es7.2和官方high level client)

    前言 最近写的一个个人项目(传送门:全终端云书签)中需要用到全文检索功能,目前 mysql,es 都可以做全文检索,mysql 胜在配置方便很快就能搞定上线(参考这里),不考虑上手难度,es 在全文检 ...

随机推荐

  1. uva 10733 The Colored Cubes<polya定理>

    链接:http://uva.onlinejudge.org/external/107/10733.pdf 题意: N 种颜色可以涂成多少种立方体~ 思路: 使正六面体保持不变的运动群总共有: 1.不变 ...

  2. vue web开发

    https://www.szzhdj.gov.cn/js/pagejs/assemblyHall_dzs1.js https://www.szzhdj.gov.cn/js/pagejs/assembl ...

  3. WildFly JBoss 应用程序服务器

    https://en.wikipedia.org/wiki/WildFly [实现基于面向服务的架构SOA的web应用和服务] WildFly,[1] formerly known as JBoss ...

  4. Jquey模糊选择

    Jquey模糊选择   属性字头选择器(Attribute Contains Prefix Selector): jQuery 属性字头选择器的使用格式是 jQuery(‘[attribute|=va ...

  5. STM32 ~ 查看系统时钟

    调用库函数RCC_GetClocksFreq,该函数可以返回片上的各种时钟的频率 函数原形 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) ...

  6. SYN FLOOD学习理解

    SYN FLOOD是一种比较常见的DoS攻击手段,它的特点就是防不胜防.SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源.SYN攻击除了能影响主机外 ...

  7. nginx启动不了

    nginx简介 Nginx是一个高性能的HTTP和反向代理服务器. 支持的操作系统众多,windows.linux. MacOS X: 可实现负载均衡: Rewrite功能强大: 电商架构大部分都采用 ...

  8. NYOJ-37 回文字符串 —— LCS变形

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=37 题解: 一开始想从两边向中间添加字符,发现这样不是最优的.因为加入字符之后,这些原本存 ...

  9. zabbix数据库创建初始化

    MariaDB [(none)]> create database zabbix character set utf8; MariaDB [(none)]> grant all privi ...

  10. springmvc junit测试

    import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.ann ...