springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch

一、Elasticsearch概念

•以 员工文档 的形式存储为例:一个文档代表一个员工数据。存储数据到 ElasticSearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。

•一个 ElasticSearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性

•类似关系:

–索引-数据库

–类型-表

–文档-表中的记录

–属性-列

更多详细内容见官方文档

a5666ff6c14179613563a5fd414c6ffb.png

二、Elasticsearch入门

2.1、安装Elasticsearch

1、在虚拟机中通过Docker拉取elasticsearch镜像

docker pull elasticsearch

2、运行镜像并使其运行成容器(9200是暴露给web端的,9300是在分布式系统中各个节点交互暴露的接口)

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name my_es 5acf0e8da90b

3、拷贝配置文件到宿主机(必须保证容器中的ES是启动状态)

从这步开始一定要跟着做,不然后面使用SpringData的接口操作时会报错。详细见ARTS第三周

docker cp  my_es:/usr/share/elasticsearch/config/elasticsearch.yml: /usr/share/elasticsearch.yml

4、停止 和 删除原来创建的容器

docker stop elasticsearch
docker rm my_es

5、重新执行创建容器命令(重点:挂载文件)

docker run -di --name=my_es -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  elasticsearch

6、 修改 /usr/share/elasticsearch.yml 将 transport.host: 0.0.0.0 前的 # 去掉后保存文件退出。 其作用是允许任何ip地址访问 elasticsearch 开发测试阶段可以这么做,生产环境下指定具体的IP

7、重启后发现重启启动失败了(纯宿主机问题),这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等

8、系统调优

(1)修改 /etc/security/limits.conf 追加内容

* soft nofile 65536
* hard nofile 65536

说明:nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制 (2)修改 /etc/sysctl.conf 追加内容

vm.max_map_count=655360

说明:限制一个进程可以拥有的VMA(虚拟内存区域)的数量

9、重启虚拟机

2.2、基本操作

1、存储文档

对于雇员目录,我们将做如下操作:

  • 每个雇员存储一个文档,包含该雇员的所有信息。
  • 每个文档都将是 employee 类型
  • 该类型位于 索引 megacorp 内。
  • 该索引保存在我们的 Elasticsearch 集群中。

实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作:

PUT /megacorp/employee/1
{"first_name" : "John","last_name" :  "Smith","age" :        25,"about" :      "I love to go rock climbing","interests": [ "sports", "music" ]
}

注意,路径 /megacorp/employee/1 包含了三部分的信息:

  • megacorp
    索引名称
  • employee
    类型名称
  • 1
    特定雇员的ID

请求体 —— JSON 文档 —— 包含了这位员工的所有详细信息,他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。

很简单!无需进行执行管理任务,如创建一个索引或指定每个属性的数据类型之类的,可以直接只索引一个文档。Elasticsearch 默认地完成其他一切,因此所有必需的管理任务都在后台使用默认设置完成。

进行下一步前,让我们增加更多的员工信息到目录中:

PUT /megacorp/employee/2
{"first_name" :  "Jane","last_name" :   "Smith","age" :         32,"about" :       "I like to collect rock albums","interests":  [ "music" ]
}PUT /megacorp/employee/3
{"first_name" :  "Douglas","last_name" :   "Fir","age" :         35,"about":        "I like to build cabinets","interests":  [ "forestry" ]
}

可以使用Postman软件模拟PUT请求

比如存储员工id为1的文档,下面会响应成功后的信息(上面的其他操作同样)

dbfcc2246034cbd57e04facaf70fd9ee.png

2、检索文档

目前我们已经在 Elasticsearch 中存储了一些数据, 接下来就能专注于实现应用的业务需求了。第一个需求是可以检索到单个雇员的数据。

这在 Elasticsearch 中很简单。简单地执行 一个 HTTP GET 请求并指定文档的地址——索引库、类型和ID。 使用这三个信息可以返回原始的 JSON 文档:

GET /megacorp/employee/1

返回结果包含了文档的一些元数据,以及 _source 属性,内容是 John Smith 雇员的原始 JSON 文档:

{"_index" :   "megacorp","_type" :    "employee","_id" :      "1","_version" : 1,"found" :    true,"_source" :  {"first_name" :  "John","last_name" :   "Smith","age" :         25,"about" :       "I love to go rock climbing","interests":  [ "sports", "music" ]}
}

将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 3、轻量搜索

一个 GET 是相当简单的,可以直接得到指定的文档。 现在尝试点儿稍微高级的功能,比如一个简单的搜索!

第一个尝试的几乎是最简单的搜索了。我们使用下列请求来搜索所有雇员:

GET /megacorp/employee/_search

可以看到,我们仍然使用索引库 megacorp 以及类型 employee,但与指定一个文档 ID 不同,这次使用 _search 。返回结果包括了所有三个文档,放在数组 hits 中。一个搜索默认返回十条结果。

{"took":      6,"timed_out": false,"_shards": { ... },"hits": {"total":      3,"max_score":  1,"hits": [{"_index":         "megacorp","_type":          "employee","_id":            "3","_score":         1,"_source": {"first_name":  "Douglas","last_name":   "Fir","age":         35,"about":       "I like to build cabinets","interests": [ "forestry" ]}},{"_index":         "megacorp","_type":          "employee","_id":            "1","_score":         1,"_source": {"first_name":  "John","last_name":   "Smith","age":         25,"about":       "I love to go rock climbing","interests": [ "sports", "music" ]}},{"_index":         "megacorp","_type":          "employee","_id":            "2","_score":         1,"_source": {"first_name":  "Jane","last_name":   "Smith","age":         32,"about":       "I like to collect rock albums","interests": [ "music" ]}}]}
}

注意:返回结果不仅告知匹配了哪些文档,还包含了整个文档本身:显示搜索结果给最终用户所需的全部信息。

接下来,尝试下搜索姓氏为 Smith 的雇员。为此,我们将使用一个 高亮 搜索,很容易通过命令行完成。这个方法一般涉及到一个 查询字符串query-string) 搜索,因为我们通过一个URL参数来传递查询信息给搜索接口:

GET /megacorp/employee/_search?q=last_name:Smith

我们仍然在请求路径中使用 _search 端点,并将查询本身赋值给参数 q= 。返回结果给出了所有的 Smith:

{..."hits": {"total":      2,"max_score":  0.30685282,"hits": [{..."_source": {"first_name":  "John","last_name":   "Smith","age":         25,"about":       "I love to go rock climbing","interests": [ "sports", "music" ]}},{..."_source": {"first_name":  "Jane","last_name":   "Smith","age":         32,"about":       "I like to collect rock albums","interests": [ "music" ]}}]}
}

4、 使用查询表达式搜索

Query-string 搜索通过命令非常方便地进行临时性的即席搜索 ,但它有自身的局限性(参见 href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html">轻量 搜索)。Elasticsearch 提供一个丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。

领域特定语言 (DSL), 指定了使用一个 JSON 请求。我们可以像这样重写之前的查询所有 Smith 的搜索 :

PUT /megacorp/employee/_search
{"query" : {"match" : {"last_name" : "Smith"}}
}

返回结果与之前的查询一样,但还是可以看到有一些变化。其中之一是,不再使用 query-string 参数,而是一个请求体替代。这个请求使用 JSON 构造,并使用了一个 match 查询(属于查询类型之一,后续将会了解)。

5、更复杂的搜索

现在尝试下更复杂的搜索。 同样搜索姓氏为 Smith 的雇员,但这次我们只需要年龄大于 30 的。查询需要稍作调整,使用过滤器 filter ,它支持高效地执行一个结构化查询。

PUT /megacorp/employee/_search
{"query" : {"bool": {"must": {"match" : {"last_name" : "smith" }},"filter": {"range" : {"age" : { "gt" : 30 } }}}}
}

ba6a28f7a69c85eb120060a4b31806c5.png

目前无需太多担心语法问题,后续会更详细地介绍。只需明确我们添加了一个 过滤器 用于执行一个范围查询,并复用之前的 match 查询。现在结果只返回了一个雇员,叫 Jane Smith,32 岁。

{..."hits": {"total":      1,"max_score":  0.30685282,"hits": [{..."_source": {"first_name":  "Jane","last_name":   "Smith","age":         32,"about":       "I like to collect rock albums","interests": [ "music" ]}}]}
}

更多详细内容见官方文档

三、SpringBoot整合Elasticsearch

3.1、简介

SpringBoot默认支持两种技术来和ES交互

1、Jest(默认不生效)需要导入Jest工具包(具体文档可去Github搜索)

2、SpringBoot提供的API:继承SpringData的接口和ElasticsearchTempldate组件

需要指定cluster-name和cluster-nodes,这种方法可能会报超时错误,就是ES版本不合适

如果版本不适配:

1)、升级Springboot版本

2)、安装对应版本ElasticSearch

spring data elasticsearch(spring-data-elasticsearch包版本)elasticsearch(ES版本)3.2.x6.5.03.1.x6.2.23.0.x5.5.02.1.x2.4.02.0.x2.2.01.3.x1.5.2

3.2、JestClient操作ES

maven依赖

 <!-- 引入操作ElasticSearch的API --><dependency><groupId>io.searchbox</groupId><artifactId>jest</artifactId><version>5.3.3</version></dependency>
  • Article.java
@Data
public class Article {@JestIdprivate Integer id;private String author;private String title;private String content;}
  • application.properties
spring.elasticsearch.jest.uris=http://192.168.25.157:9200 
  • 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate JestClient jestClient;@Testpublic void testIndex () throws IOException {Article article = new Article();article.setId(1);article.setAuthor("Yang");article.setTitle("好消息");article.setContent("Hello World");Index index = new 	     Index.Builder(article).index("ahead").type("article").build();jestClient.execute(index);}@Testpublic void testSearch() throws IOException {String json = "{n" +"    "query" : {n" +"        "match" : {n" +"            "content" : "hello"n" +"        }n" +"    }n" +"}";Search search = new Search.Builder(json).addIndex("ahead").addType("article").build();SearchResult result = jestClient.execute(search);//转换为对象Article article = result.getSourceAsObject(Article.class, true);//获取响应的所有信息JsonObject jsonObject = result.getJsonObject();System.out.println(article);System.out.println(jsonObject);}}
  • 先执行存储文档方法没问题,然后再执行检索方法,结果正确

879951802317789e114435eee26d3bf3.png

更多详细信息参考官方文档

3.3、SpringData的接口操作ES

  • maven依赖
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
  • Book.java
@Document(indexName = "ahead", type = "book")
@Data
public class Book {  private Integer id;    private String name;    private String author;
}
  • BookRepository.java
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {/*** 按照SpringData所定义的规范来创建方法底层就会帮我们实现* 某个方法对应什么操作具体可参考官方文档* 通过书名模糊查询* @param name* @return*/List<Book> findByNameLike(String name);
}
  • application.properties
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.25.157:9300

cluster-name可通过访问ip:9200获取

5ff1d101bfb824b7548679ddbc8016c9.png
  • 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate BookRepository bookRepository;@Testpublic void testRepositoryIndex() {Book book = new Book();book.setId(1);book.setName("西游记");book.setAuthor("吴承恩");bookRepository.index(book);}@Testpublic void testRepositorySearch() {List<Book> book = bookRepository.findByNameLike("游");System.out.println(book);}}
  • 先执行存储方法没问题,然后执行检索方法,结果正确。

026d772f4261b527ca02ad7f6b63e053.png

3.4、ElasticsearchTemplate操作ES

用的还是上面的环境

  • 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void testElasticsearchTemplateIndex() {Book book = new Book();book.setId(2);book.setName("三国演义");book.setAuthor("罗贯中");IndexQuery indexQuery = new IndexQueryBuilder().withObject(book).build();elasticsearchTemplate.index(indexQuery);}@Testpublic void testElasticsearchTemplateSearch() {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new MatchQueryBuilder("name", "国")).build();List<Book> books = elasticsearchTemplate.queryForList(searchQuery,Book.class);System.out.println(books);}
}
  • 先执行存储文档方法成功后,再执行检索方法结果正确。

0be11e26f4bc8df97c662d90636e3989.png

更多详细信息参考官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php制作图片轮播_图片轮播效果实现方法

图片轮播效果如何实现呢本文主要介绍了JQuery实现图片轮播效果的制作原理以及实现代码&#xff0c;文章末尾附上源码下载&#xff0c;具有很好的参考价值。下面跟着小编一起来看下吧&#xff0c;希望能帮助到大家。用JQuery操作DOM确实很方便&#xff0c;并且JQuery提供了非常人…

python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/ 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 今天来说说交流群里一位群友问的Python题目。刚开始由于没有电脑&#xff0c;我也没有运行出来&…

个人应用开发详记. (三)

好久没来更新了... IM即时通讯已进入最后阶段. 各个功能模块 框架基本写好. 剩下的就是细节上的优化了 由于内容上并没有什么大幅度的变动 . 就不上图了 . 元旦回家 放假3天~ 争取年前搞定此APP 转载于:https://www.cnblogs.com/ImyFen/p/5089968.html

r语言清除变量_如何优雅地计算多变量 | R语言进阶

社会科学研究经常会遇到“超多变量”的情况——多量表、多维度、多题项&#xff0c;以及复杂的正反计分题……如何更高效地计算量表总分&#xff1f;如何更简洁地进行反向计分&#xff1f;传统的统计工具&#xff08;Excel、SPSS等&#xff09;虽然也能解决这些问题&#xff0c…

php模板初级教程,风格模板初级不完全修改教程

风格模板初级不完全修改教程更新时间&#xff1a;2006年10月09日 00:00:00 作者&#xff1a;就自己的一点点经验&#xff0c;希望能给初接触模版修改的朋友有个参考。关于模版修改&#xff0c; 引用星星签名里的一句话“学好HTML很重要” &#xff1a;)一个风格&#xff0c;…

语音对讲软件_微信语音转播软件是哪个?怎样一键转发?

文末送社群运营资料有一句话说得好&#xff0c;好马配好鞍&#xff0c;如果经验丰富的社群工作人员想要看到良好的社群运营效果&#xff0c;那单单凭借个人的力量是远远不够的&#xff0c;建议将希望寄托在第三方工具的身上&#xff0c;比如微信语音转播软件就是绝佳选择。按照…

php if require,关于php:required_if Laravel 5验证

我有一个表格&#xff0c;用户可以填写出售房屋的信息。 对于其中一项投入&#xff0c;用户必须选择"待售"或"待租"天气。 如果是For Sale&#xff0c;则会出现两个价格输入字段&#xff0c;如果是For Rent&#xff0c;则会基于jQuery显示一些其他价格输入…

asp.net 安装element ui_不用上官网,自己部署一套Element官方最新文档

ElementUI官方的访问速度一直很慢&#xff0c;公司内网也无法进行外网访问。故研究了下最新的ElementUI API(2.13.2)部署教程。先上效果图ElementUI文档部署过程到github下载最新的elementui源码&#xff0c;这里我使用git下载到本地git clone https://github.com/ElemeFE/elem…

如何写一个计算器?

考虑这样一个问题&#xff0c;给定一个字符串&#xff0c;“11(34)-2*38/2”&#xff0c;如何将它转化为如下形式&#xff1a; “112” “347” “279” “2*36” “9-63” “8/24” “347” 换句话说&#xff0c;就是如何将字符串按照四则运算计算出来&#xff0c;如何写一个计…

由于在客户端检测到一个协议错误_HTTP协议,你了解多少?

HTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议&am…

idea中没有j2ee_idea神器功能大全

IDEA 全称 IntelliJ IDEA&#xff0c;是java语言开发的集成环境&#xff0c;IntelliJ在业界被公认为最好的java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn、github等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面…

linux 固定ip_linux固定IP

在新安装的Linux系统命令行下&#xff0c;敲入&#xff1a;ifconfig,显示如下界面。上面这张图显示网卡没有启动&#xff0c;那么我们敲入代码&#xff1a;ifup eth0启动网卡。网卡启动后&#xff0c;我们可以看出&#xff0c;IP地址和网关等其他信息都已经出现。但是我们需要的…

php编译称opcode文件,PHP源码保护和性能加速

什么是Opcache?每一次执行 PHP 脚本的时候&#xff0c;该脚本都需要被编译成字节码&#xff0c;而 Opcache 可以对该字节码进行缓存&#xff0c;这样&#xff0c;下次请求同一个脚本的时候&#xff0c;该脚本就不需要重新编译&#xff0c;这极大节省了脚本的执行时间&#xff…

9553下载站java,java se development kit11最新版 64位

java se development kit11&#xff0c;简称java11&#xff0c;是一款专门进行java开发的编程软件&#xff0c;这款软件还拥有applet和组件的开发环境等操作&#xff0c;是程序员们进行java开发的飞铲不错软件&#xff0c;如果你喜欢这款软件&#xff0c;那就来下载基本介绍自从…

java sleep方法_一文搞懂 Java 线程中断!

在之前的一文《如何”优雅”地终止一个线程》详细说明了 stop 终止线程的坏处及如何优雅地终止线程&#xff0c;那么还有别的可以终止线程的方法吗&#xff1f;答案是肯定的&#xff0c;它就是我们今天要分享的——线程中断。下面的这断代码大家应该再熟悉不过了&#xff0c;线…

java 观察者模式_图解Java设计模式之观察者模式

图解Java设计模式之观察者模式天气预报项目需求天气预报设计方案 1 - 普通方案观察者模式&#xff08;Observer&#xff09;原理观察者模式解决天气预报需求观察者模式在JDK应用的源码分析天气预报项目需求1&#xff09;气象站可以将每天测量到的湿度、温度、气压等等以公告的形…

怎么在同一页中分页_分库分表业界难题,跨库分页的几种常见方案

为什么需要研究跨库分页&#xff1f;互联网很多业务都有分页拉取数据的需求&#xff0c;例如&#xff1a;(1)微信消息过多时&#xff0c;拉取第N页消息&#xff1b;(2)京东下单过多时&#xff0c;拉取第N页订单&#xff1b;(3)浏览58同城&#xff0c;查看第N页帖子&#xff1b;…

content add tpl.php,phpcms后台批量上传添加图片文章方法详解(一)

注&#xff1a;以下所有代码中&#xff0c;红色部分为增加部分。一、在后台增加批量添加按钮打开“phpcms\modules\content\templates\content_list.tpl.php”文件搜索“$category[‘catname‘]));?>”在这句话的后天的添加&#xff1a;a echo"" href":;&q…

sap 供应商表_财务人员学习SAP的路线图

有许多网友在公众号给我们留言&#xff0c;咨询财务人员学习SAP的事情&#xff0c;如何才能快速掌握SAP&#xff0c;有没有捷径什么的。今天就给大家分享一下财务人员学习SAP的经验&#xff0c;希望能够为财务人员揭开SAP神秘的面纱&#xff0c;学习SAP少走弯路。刚接触SAP的财…

nodejs搭配phantomjs highcharts后台生成图表

简单分享一下&#xff0c;后台使用nodejs结合highcharts、phantomjs生成报表图片的方法。这主要应用在日报邮件。 主要参考以下资料&#xff1a; http://www.highcharts.com/component/content/article/2-news/52-serverside-generated-charts#phantom_usagehttps://bitbucket.…