最新动态
开发搜索功能(ES支持)
2024-10-31 23:57

我们要想完成高效的搜索任务,需要ES的支持

开发搜索功能(ES支持)

因为了

我们在前端页面中完成的搜索是

这样就要求我们在查询之前,需要先将 保存到ES中

一开始我们采用最原始的方法:

搜索功能编写在mall-search模块中

它使用的实体类在cn.tedu.mall.pojo.search.eneity包下SpuForElastic

这个类有4个字段是具备分词功能的

所以支持我们使用这4个字段进行查询

仍然使用SpringDataElasticsearch框架来操作ES

按照SpringData的规范,我们创建包repository

在这个包中创建SpuForElasticRepository接口,代码如下

这个接口提供了批量新增数据到ES的方法

但是要想获得数据库中所有pms_spu表的数据,必须连接数据库查询这些数据

但是search模块是负责管理ES的,所以需要Dubbo调用product模块获取这些数据

经过观察发现业务逻辑逻辑层调用ForFrontSpuServiceImpl类中

具有一个getSpuByPage的方法

他分页查询所有spu信息

分页的原因是一般加载到ES中的数据量非常大(几十万上百万条),我们不可能一次性将所有数据查询出来,增到ES中,必须分批分次

分页查询就是典型的分批查询,每次查询一部分数据,通过循环遍历,将每页数据都增到ES中

mall-search-webapi模块创建service.impl包

包中创建SearchServiceImpl类,用于将数据库中的数据加载到ES中

代码如下

运行测试前保证

NacosSeata\ES启动

启动product模块

运行测试,没有报错即可

我们再通过连接ES来进行全查

检验上面执行的加载工作是否达到效果

仍然在测试类中,再编写一个方法,使用SpringData提供的全查方法查询后遍历输出

检查输出内容,代码如下

电商网站一定会有按用户输入的关键字进行搜索的功能

这样的搜索都是搜索ES查询到的结果

上面我们已经将所有spu信息保存到了ES中

下面通过查询逻辑将搜索结果显示出来

如果我们按照关键字"手机"进行搜索

可以在Repository接口中编写自定义方法

上面的查询可以通过测试类测试

尤其需要关注ES是否已经启动

不需要其它项目的支持,直接运行测试即可

我们业务中需要4个字段的条件查询,是可以通过方法名称的编写实现的

SpringData也支持我们在代码中编写查询语句,以避免过长的方法名

测试代码

在实际开发中

我们数据库中的数据和Elasticsearch中的数据还存在同步问题

为了保持数据库中的数据和Elasticsearch中的数据一致

我们可以使用下面的办法

1.在所有对spu表进行增删改的操作代码运行后,也对ES中的数据进行相同的操作

​ 但是会有比较多的代码要编写,而且有比较明显的事务处理问题

  1. 实际上业界使用Elasticsearch有一个组合叫ELK,其中L(logstash)可以实现自动同步数据库和ES的信息

修改了方法的定义,原有的调用会报错,注释掉测试中的调用代码即可!

SearchServiceImpl类添加实现方法如下

创建controller包

包中创建SearchController编写搜索方法,代码如下

测试

保证NacosseataES启动

因为当前search项目过滤器解析JWT所以需要登录才能访问

启动search模块

建议启动passport模块去进行登录获得jwt

    以上就是本篇文章【开发搜索功能(ES支持)】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/6298.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多