1、Elasticsearch实现全文检索
需要实现三个功能
搜索功能
ES 数据初始化
ES与数据库的异步同步功能
集成 Elasticsearch 的方式
比较原生的 TransportClient client
Spring 提供的 ElasticsearchTemplate
Spring Data JPA 提供的 ElasticsearchRepository
1、先写一个pojo实体类PostDocment,用于保存ES中的document(类比mysql中的一条记录),以后的全文检索的是ES中的,而不是数据库
2、Spring Data ElasticSearch 基于 Spring Data JPA简化了 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 ,我们需要自定义符合jpa命名规范的PostRepository接口,继承ElasticsearchRepository接口,用于增删改查ES中的数据。
3、首页就需要实现全文检索,所以在IndexController中写方法接口
4、在SearchServiceImpl中实现分页显示搜索记录,注意:jpa中的Page不是mybatis-plus中的Page,需要将mybatis-plus的page 转成 jpa的page,搜索es得到pageData后,再将jpa的pageData转成mybatis-plus的pageData
5、至此已经完成了 es 搜索引擎的查询功能,但是现在还没有数据,只有管理员有权限将数据库中的数据同步到ES(页面访问地址localhost:9100),因而同步方法写在AdminController中
6、在SearchServiceImpl中实现将数据库中的数据同步到ES,全文检索不查询数据库,而是通过查ES(通过modelMapper将PostVo映射转换为PostDocment)

2、修改数据库中文章后,通过rabbitmq通知ES添加/更新/删除相应的数据
生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则;在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key,当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种,direct类型的Exchange路由规则是把消息路由到那些binding key与routing key完全匹配的Queue中。
1、在配置类RabbitConfig中设置队列、交换机、路由键
2、当添加/更新文章并提交,或者直接删除文章时,需要在PostController中的submit/delete方法中将相应的处理消息发送给MQ服务器
3、写一个PostMqIndexMessage类,封装消息的类型
4、写一个监听类,用于监听消息队列,并发送消息给ES进行相应的同步处理。处理时要注意:是先从数据库中获得记录,再转化为document,然后通过postRepository.save/deleteById()操作ES中的document。
layui.form用ajax提交表单时的问题
使用layui的form组件用ajax提交表单发送请求时,总是无法收到回调函数,success与error中的回调均不执行,且该表单会自动刷新。
解决办法:在提交表单的方法form.on()
中添加return false
,以防止表单自动跳转刷新
解决这个问题花了很久的时间,因为表单的自动刷新导致在浏览器控制台的错误数据刚出来就会被刷新掉。下面是我曾试过的解决方法:
1、修改网页的编码格式,将utf-8改成中文编码
2、先在network中查到了一个status为canceled的错误,于是百度查找解决办法,给出的解办法是在ajax请求中设置如下参数:async: false,即将其改为同步
这里简单了解下ajax同步与异步的作用:
async. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的success方法,这时候执行的是两个线程。
async 设置为 false,则所有的请求均为同步请求,在没有返回值之前,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。