查询效率较低
数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。
1.搜索引擎 ElasticSearch
基于倒排索引技术,倒排索引的概念是基于MySQL这样的正向索引而言的
正向索引:以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档,正向索引适合于根据索引字段的精确搜索,不适合基于部分词条的模糊匹配。
2.IK分词器
IK分词器包含两种模式:
ik_smart
:智能语义切分ik_max_word
:最细粒度切分
出现了很多新的词语,在原有的词汇列表中并不存在。比如:“泰裤辣”,“传智播客” 等
IK分词器提供了扩展词汇词库 的功能
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为
json
格式后存储在elasticsearch
中:
索引和映射
I 所有用户文档,就可以组织在一起,称为用户的索引;
II 所有商品的文档,可以组织在一起,称为商品的索引;
III 所有订单的文档,可以组织在一起,称为订单的索引;
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。
对安全性要求较高的写操作,使用mysql实现
对查询性能要求较高的搜索需求,使用elasticsearch实现
3.索引库操作
向es中存储数据,必须先创建Index和Mapping
对应的每个字段映射(Mapping)
创建索引库和映射
基于Kibana的DevTools来编写请求做测试
查询索引库
修改索引库
向索引库中添加新字段,或者更新索引库的基础属性。不能修改原有字段
删除索引库
新增文档
查询文档
删除文档
全量修改
覆盖原来的文档
根据指定的id删除文档
新增一个相同id的文档
局部修改
批处理
批处理采用POST请求
4.RestAPI
客户端操作ES,组装DSL语句,通过http请求发送给ES
初始化RestClient
在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient
的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。
初始化RestHighLevelClient
创建索引库
实现对商品搜索,所以我们需要将商品添加到Elasticsearch中\
索引库文档结构
创建商品索引库
删除索引库
判断索引库是否存在
5.文档操作测试类
实体类ItemDoc
新增商品文档
1)根据id查询商品数据
Item
2)将
Item
封装为ItemDoc
并序列化为JSON3)创建IndexRequest,指定索引库名和id
4)准备请求参数,也就是JSON文档
5)发送请求
查询文档
1)准备Request对象。这次是查询,所以是
GetRequest
2)发送请求,得到结果。因为是查询,这里调用
client.get()
方法3)解析结果,就是对JSON做反序列化
修改文档
1)准备
Request
对象。这次是修改,所以是UpdateRequest
2)准备参数。也就是JSON文档,里面包含要修改的字段
3)更新文档。这里调用
client.update()
方法
删除文档
1)准备Request对象,因为是删除,这次是
DeleteRequest
对象。要指定索引库名和id3)发送请求。因为是删除,所以是
client.delete()
方法
批量导入文档
利用JavaAPI批量导入
IndexRequest
,也就是新增UpdateRequest
,也就是修改DeleteRequest
,也就是删除
导入商品数据 采用循环遍历方式,每次导入1000条左右的数据
6.拆分搜索微服务
将搜索相关功能抽取到这个微服务中。
搜索微服务要对接的是es而不是mysql;所以抽取的时候要注意删除mysql相关的内容,添加es相关依赖。
创建类
com.hmall.search.controller.SearchController
com.hmall.search.service.impl.SearchServiceImpl
com.hmall.search.service.ISearchService
hmall\search-service\src\main\java\com\hmall\search\domain\vo\PageVO.java
hmall\search-service\src\main\java\com\hmall\search\domain\query\ItemPageQuery.java
配置网关
hm-gateway
商品查询接口
在item-service
服务中提供一个根据id查询商品的功能,并编写对应的FeignClient
改造ItemClient
数据同步
每当商品服务对商品实现上架时,发送RabbitMQ队列(交换机items.topic,路由key:item.up;队列search.item.up.queue)消息;新增索引库中的商品数据;
每当商品服务对商品实现下架时,发送RabbitMQ队列(交换机items.topic,路由key:item.down;队列search.item.down.queue)消息;删除索引库中的商品数据;
发送消息item-service整合MQ