推广 热搜: 服务  数据分析系统  搜索  获取  冬季  小红  适合  哪些  软件  查询 

微服务[学成在线] day11:基于 ElasticSearch 构建搜索服务

   日期:2024-11-09     作者:izped    caijiyuan   评论:0    移动:http://changmeillh.kub2b.com/news/226.html
核心提示:为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后

为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。

微服务[学成在线] day11:基于 ElasticSearch 构建搜索服务

本章节为【学成在线】项目的 的内容

1、创建映射

创建 索引库,方式如下

post:

2、插入原始数据

向 中插入以下三个文档数据:

PUT:

PUT:

PUT:

3、简单的搜索一下

简单搜索就是通过 进行查询,以 方式请求 。

格式:GET https://cloud.tencent.com/developer/_search?q=.....

q:搜索字符串。

例子:?q=name:spring

搜索name中包括spring的文档。

DSL(Domain Specific Language) 是 提出的基于 的搜索方式,在搜索时传入特定的 格式的数据来完成不同的搜索需求。

比 (在url传递搜索参数) 搜索方式功能强大,在项目中建议使用 方式来完成搜索。

1、查询所有文档

查询所有索引库的文档。

发送:post

查询指定索引库 指定类型 下的文档。(通过使用此方法)

发送:post

_source: 源过虑设置,指定结果中所包括的字段有哪些。

搜索结果:

结果说明:

使用JAVA 客户端实现:

具体代码如下:

2、分页查询

支持分页查询,传入两个参数: 和 。

发送:post

使用JAVA 客户端实现:

3、Term Query

为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。

发送:post

上边的搜索会查询 包括 这个词的文档。

JAVA客户端实现:

4、根据id精确匹配

ES提供根据多个id值匹配的方法:

post: http://127.0.0.1:9200/xc_course/doc/_search

JAVA客户端实现:

5、match query (匹配单个字段)

(1) 基本使用

即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。

与 区别是 在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。

需求:检索 字段中包含 spring开发 的文档,并且结果只显示该文档的 name 字段

发送:post

operator: 表示 只要有一个词在文档中出现则就符合条件, 表示每个词都在文档中出现则才符合条件

搜索结果:

上边的搜索的执行过程是:

1、将 分词,分为 、 两个词

2、再使用 和开发两个词去匹配索引中搜索。

3、由于设置了 为 ,只要有一个词匹配成功则就返回该文档。

我们将 operator 设置为 再次进行搜索

从结果中我们可以看到,使用 进行搜索后,ES会匹配指定的字段包含 、 两个词的结果。

JAVA客户端实现:

(2) minimum_should_match

上边使用的 表示只要有一个词匹配上就得分,如果实现三个词至少有两个词匹配如何实现?使用 可以指定文档匹配词的占比:

比如搜索语句如下:

会被分为三个词:、、

设置 表示,三个词在文档的匹配占比为 80%,即 3*0.8=2.4,向上取整得2,表示至少有 两个词 在文档中要匹配成功。

对应的 如下:

6、multi query (匹配多个字段)

上边学习的 和 一次只能匹配一个 ,本节学习 ,一次可以匹配多个字段。

(1) 基本使用

单项匹配是在一个 中去匹配,多项匹配是拿关键字去多个 中匹配,例子如下:

发送:post

拿关键字 去匹配 和 字段。

(2) 提升 boost (权重)

匹配多个字段时可以提升字段的 (权重)来提高得分

例子:提升 之前,执行下边的查询:

通过查询发现 排在前边。

提升 ,通常关键字匹配上 的权重要比匹配上 的权重高,这里可以对 的权重提升。

表示权重提升 倍,执行上边的查询,发现 中包括 关键字的文档排在前边。

JAVA 客户端:

7、布尔查询

布尔查询对应于 的 查询,实现将多个查询组合起来。

三个参数:

:文档必须匹配 所包括的查询条件,相当于

:文档应该匹配 所包括的查询条件其中的一个或多个,相当于

:文档不能匹配 所包括的该查询条件,相当于

分别使用 、、 测试下边的查询:

发送:POST

:表示必须,多个查询条件必须都满足。(通常使用)

:表示或者,多个查询条件只要有一个满足即可。

:表示非。

JAVA客户端实现:

8、过滤器

过虑是针对 搜索的结果 进行过虑,过虑器主要判断的是文档是否匹配,不去 计算和判断文档的匹配度得分,所以过虑器的 性能 比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者 过虑器查询 共同使用。

过虑器在布尔查询中使用,下边是在搜索结果的基础上进行过滤

发送:POST

range:范围过虑,保留大于等于 并且小于等于 的记录。

term:项匹配过虑,保留 等于 的记录。

注意: 和 一次只能对一个 设置范围过虑。

JAVA 客户端实现:

9、排序

可以在字段上添加一个或多个排序,支持在 、、 等类型上添加, 类型的字段上不允许添加排序。

需求:过虑 元价格范围的文档,并且对结果进行排序,先按 降序,再按价格升序

发送 POST

dest 表示降序,从大到小,asc 表示升序,从小到大

JAVA客户端实现

10、高亮显示

JAVA客户端实现

通常以集群方式工作,这样做不仅能够提高 的搜索能力还可以处理大数据搜索的能力,同时也增加了系统的容错能力及高可用, 可以实现 级数据的搜索。

下图是 集群结构的示意图:

从上图总结以下概念:

1、结点

集群由多个服务器组成,每个服务器即为一个 结点(如果该服务器只部署了一个 进程)。

2、分片

当我们的文档量很大时,由于内存和硬盘的限制,同时也为了提高 的处理能力、容错能力及高可用能力,我们将索引分成若干分片,每个分片可以放在不同的服务器,这样就实现了多个服务器共同对外提供索引及搜索服务。 一个搜索请求过来,会分别从各各分片去查询,最后将查询到的数据合并返回给用户。

3、副本

为了提高 的高可用同时也为了提高搜索的吞吐量,我们将分片复制一份或多份存储在其它的服务器,这样即使当前的服务器挂掉了,拥有副本的服务器照常可以提供服务。

4、主结点

一个集群中会有一个或多个主结点,主结点的作用是集群管理,比如增加节点,移除节点等,主结点挂掉后ES会重新选一个主结点。

5、结点转发

每个结点都知道其它结点的信息,我们可以对任意一个结点发起请求,接收请求的结点会转发给其它结点查询数据

1、节点的三个角色

下边的例子实现创建一个 2结点的集群,并且索引的分片我们设置 2片,每片一个副本。

主结点: 节点主要用于集群的管理及索引,比如新增结点、分片分配、索引的新增和删除等。

数据结点: 节点上保存了数据分片,它负责索引和搜索操作。 客户端结点: 节点仅作为请求客户端存在, 的作用也作为负载均衡器, 节点不存数据,只是将请求均衡转发到其它结点。

通过下边两项参数来配置结点的功能:

四种组合方式:

2、创建节点

(1) 配置节点1

结点1 对外服务的 端口是 ,集群管理端口是

配置 elasticsearch.yml

结点名:

内容如下

启动节点1

(2) 配置节点2

我们测试环境就在同一台机器上部署两个节点,所以需要将 的安装包再解压一份,并复制节点1的ik插件和一些日志配置文件到 节点2 的目录下

结点 对外服务的 端口是 ,集群管理端口是

结点名:

内容如下 :

启动结点2

3、创建索引库

1)使用head连上其中一个结点

上图表示两个结点已经创建成功。

2)下边创建索引库,共 个分片,每个分片一个副本。

创建成功,刷新 head

上图可以看到共有4个分片,其中两个分片是副本。

4、集群的健康状态

通过访问 GET 来查看 的集群健康情况。

用三种颜色来展示健康状态: 、 或者 。

GET 请求:

响应结果:

1)创建映射并写入文档

连接 其中任意一台结点,创建映射写入文档。

POST

响应结果:

从上边的提示可看出,两个分片都保存成功。

2)搜索

向其它一个结点发起搜索请求,查询全部数据。

3)关闭一个结点

ES会重新选中一个主结点(前提在配置结点时允许它可以为主结点)

此时向活的结点发起搜索请求,仍然正常。

4)添加一个结点

添加结点 ,端口设置为:

端口是:

集群管理端口是

结点名:

此结点的配置:

启动结点3,刷新 ,下图显示 将分片分在了 个结点

向结点3发起搜索请求:

GET: http://127.0.0.1:9202/xc_course/doc/_search

全部数据可被正常搜索到。

1、需求分析

2、搜索流程

1、课程管理服务将数据写到 数据库

2、使用 将 数据库中的数据写到 的索引库。

3、用户在前端搜索课程信息,请求到搜索服务。

4、搜索服务请求 搜索课程信息。

1、技术方案

如何维护课程索引信息?

1、当课程向 添加后同时将课程信息添加到索引库。采用 实现,会从 中 将数据采集到 索引库。

2、当课程在 更新信息后同时更新该课程在索引库的信息。

采用 实现。

3、当课程在 删除后同时将该课程从索引库删除。

手工写程序实现,在删除课程后将索引库中该课程信息删除。

2、准备课程索引信息

课程发布成功在 数据库存储课程发布信息,此信息作为课程索引信息。

创建课程发布表

课程信息分布在 、 等不同的表中。

课程发布成功为了方便进行索引将这几张表的数据合并在一张表中,作为课程发布信息。

创建 表

创建表模型
添加课程索引

我们需要在课程发成功后执行添加课程索引的操作

1)创建 表的

我们先将添加索引拆分为两个方法:createCoursePub、saveCoursePub

3)修改课程方法,调用 和 方法

3、搭建ES环境

创建索引库 , 创建 索引库,1分片,0个副本。

创建映射

POST:

4、Logstash创建索引

Logstash是ES下的一款开源软件,它能够同时 从多个来源采集数据、转换数据,然后将数据发送 中创建索引。

本项目使用 将 中的数据采用到ES索引中。

下载 Logstash

下载的 要和ES的版本保持一致,下载地址

下载完成后解压即可

安装 Logstash

是开发的,先下载 并安装

下载地址:

安装完成查看是否安装成功

版本本身不带 插件,需要手动安装 ,在bin目录下执行以下命令

安装成功后我们可以在 根目录下的 目录查看对应的插件版本

创建模板文件

的工作是从 中读取数据,向ES中创建索引,这里需要提前创建 的模板文件以便 使用。

在 的 目录创建 ,内容如下:

该文件对于的是ES库中的映射

配置 mysql.conf

在 的 目录下配置 文件供 使用, 会根据 文件的配置的地址从 中读取数据向 中写入索引。

参考

配置输入数据源和输出数据源。

说明:

1、 采用 时区问题

采用 时区,比北京时间早8小时,所以 读取数据时让最后更新时间加8小时

2、 每个执行完成会在 记录执行时间下次以此时间为基准进行增量同步数据到索引库。

测试

启动

修改 中的数据,并且修改 为当前时间,观察 日志是否读取到要索引的数据。

最后用 登录 查看索引文档内容是否修改。

1、需求分析

1、根据 分类 搜索课程信息。

2、根据 关键字 搜索课程信息,搜索方式为全文检索,关键字需要匹配课程的名称、 课程内容。

3、根据 难度等级 搜索课程。

4、搜索结点分页显示。

技术分析

1、根据关键字搜索,采用 ,搜索 、、

2、根据分类、课程等级搜索采用过虑器实现。

3、分页查询。

4、高亮显示。

2、创建搜索服务工程

该工程环境我们在 已经搭建完成,如果你未学习前面的章节,请参考 的内容。

3、构建API

4、Service

按关键词搜索

在 中配置

完整代码如下

servcice 的代码中的注释已经写得很详细了,这里我就不再做过多的解释,请详细的阅读上述的代码。

5、Controller

6、测试

根据关键字搜索

使用 测试

GET: 开发

根据价格、等级、难度进行搜索
本文地址:http://sicmodule.kub2b.com/news/226.html    企库往 http://sicmodule.kub2b.com/ , 查看更多
 
标签: 服务 构建
 
更多>同类最新资讯
0相关评论

新闻列表
企业新闻
推荐企业新闻
推荐图文
推荐最新资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号