Django操作ES实现题目的高亮搜索功能
- 一、基础配置
- 二、使用ES完成题目的高亮搜索
- 1. ES的初始化接口
- 2. 使用ES实现题目的增删改查
- 1. 题目的高亮搜索
- 2. 题目的高亮搜索优化
- 3. 将数据存储到MYSQL中持久化存储并同步到ES中
一、基础配置
- 下载依赖,与之前配置的ES版本一致。
ES的配置请参考文件 ES的基础使用
pip install elasticsearch==7.15.2
-
在config文件夹下创建一个ES的配置文件
配置ES的IP和端口
-
在使用的视图中创建ES的连接对象
1)打开work文件夹下的views.py文件,导入ES
2)创建ES客户端对象,连接ES服务
3)确认下ES的docker容器已经启动
二、使用ES完成题目的高亮搜索
分析:
1. ES的初始化接口
1)在TopicViewSet视图下增加ES的初始化接口,将MYSQL的数据同步到ES。
备注:这个接口的使用场景,ES崩掉或重新部署ES服务,将mysql中的数据同步到ES中进行恢复。
# 初始化ES@action(methods=['put'], detail=False)def inites(self,request):# 获取mysql中的所有题目数据serializer = self.get_serializer(self.get_queryset(),many=True)data = serializer.data# 插入到ES中for i in data:#将数据插入到topic这个索引中,没有索引就会创建#这里不指明ID,会自动生成ID,id=i['id']这里我们直接使用数据库中的ID,与数据库保持一致#body表示要插入的数据内容es.index(index='topic',id=i['id'],body=i)return Response(serializer.data)
2)使用POSTMAN进行测试
3)在ES-HEAD可视化工具中,可以查看到数据
2. 使用ES实现题目的增删改查
1. 题目的高亮搜索
@action(methods=['get'], detail=False)def search(self,request):"""GET /topic/_doc/_search{"query":{"match":{"title":"" #title是要搜索的字段}},"highlight":{"pre_tags":"<span style='color:red'>", #开始标签"post_tags":"</span>", #结束标签"fields":{"title":"" #title是要高亮的字段}}}"""#获取前端传入的数据,GET请求通过query_params获取前端传入的参数data = dict(request.query_params)subject = data.get('subject',[''])[0] #如果没传参,返回['']空列表query = {"query":{"match":{"subject":subject}},"highlight":{"pre_tags"<