Django整合ElasticSearch,实现数据的快速检索(有代码)
这里写目录标题
- 1 背景
- 2 Haystack 是什么
- 3 安装相关包,与配置
- 4 开启es和es可视化工具
- 5 生成索引
- 6 改代码
1 背景
Haystack 的官网
https://django-haystack.readthedocs.io/en/master/
2 Haystack 是什么
这个就是一个工具,就是连接django和es的中间的一个东西,
Haystack 为 Django 提供模块化搜索。它具有统一、熟悉的 API,允许您插入不同的搜索后端(例如Solr、 Elasticsearch、Whoosh、Xapian等),而无需修改代码。
3 安装相关包,与配置
pip install drf-haystack
pip install elasticsearch==7.6.0
安装的elashsearch 版本要和你本地的一样,在启动的时候报错,就是确实依赖,提示缺少什么安装什么,最后都安装好之后,
1 注册应用
INSTALLED_APPS = [...'haystack',...
]
就是要把haystack当做APP注册到项目里面
2 配置
在配置文件中配置haystack使用的搜索引擎后端
本地不同的es,就需要不同的版本,这个去官网找
3 之后创建索引类,这个就是和django里面model一样,因为model里面的每一个类代表一个表,所以我们需要新建一个文件夹,放es里面的实体类
在你对应要创建索引的表的APP的根目录下,创建这个文件
文件的名称必须是这个
search_indexes.py
里面的内容是
# 索引模型类的名称必须是 模型类名称 + Index
from haystack import indexes
from .models import jtsgb# 必须继承 indexes.SearchIndex, indexes.Indexable
class jtsgbIndex(indexes.SearchIndex, indexes.Indexable):# 以下的字段,是es里面对应的字段# 第一个必须这样写text = indexes.CharField(document=True, use_template=True)
# 下面的就是和你model里面的一样了name = indexes.CharField(model_attr='name')zzxm = indexes.CharField(model_attr='zzxm')
# 必须这个写,返回的就是你的model名称def get_model(self):"""返回建立索引的模型类"""return jtsgb# 返回你的查询的结果,可以改成一定的条件的,但是格式就是这样def index_queryset(self, using=None):"""返回要建立索引的数据查询集"""return self.get_model().objects.all()
4 在templates目录中创建text字段使用的模板文件
目录结构必须是这样
object可以理解为模型类的对象,搜索时,可以根据这三个字段来搜索,就是你es搜索,会根据那些字段进行查询,就会在这个文件里面配
以上都弄好之后,启动你的es,还有可视化工具
4 开启es和es可视化工具
5 生成索引
我们在django项目里面相当于已经集成了es,也配置了一些东西,那么现在就需要使用项目在es软件里面生成索引
手动生成初始索引
python manage.py rebuild_index
或者直接在pycharm软件里面,按照这个步骤
如果不报错,那么就成功了,就打开es软件
看到已经生成了索引库
并且索引库里面有数据了,rebuild_index 这个命令就是将我们MySQL数据库里面的数据同步到es里面,之后我们查询的的就是es,不是mysql了,所以我们在操作完mysql数据库之后,要及时的同步数据,或者写个定时器,进行同步数据;
6 改代码
我们现在完成的是将django集成了es,但是我们自己写的页面查询功能,如果改为查询es了?
第一步:
写个路由,view里面是类的形式,路由里面,类的后面一定要加括号
第二步,写对应的后台接口,就是写view
# 一定要继承SearchView
class MySearchView(SearchView):# 重写人家的方法def create_response(self):# 人家的,就这样写,获取到的就是全部的东西context = self.get_context()data_list = []# context['page'].object_list 这样获取到的就是 数据的list集合for sku in context['page'].object_list:# 获取表里面的数据,就是前缀就是sku.objectprint(sku.object.name)data_list.append({'id': sku.object.id,'name': sku.object.name,'zzxm':sku.object.name,'gszy':sku.object.gszy,'sglx_id':sku.object.sglx_id,'gmrq': sku.object.gmrq,'ydsl': sku.object.ydsl,'description': sku.object.description,'thumbnail': sku.object.thumbnail,'desc_pack': sku.object.desc_pack,})content = {}if data_list:content = {'active_menu': 'homepage','xw_list': data_list,}else:xw_list = jtsgb.objects.all()[0:1]content = {'active_menu': 'homepage','xw_list': xw_list,}# 渲染到我们自己写的页面return render(self.request, 'index1.html', {"context":context,"content":content})
以上就开发完成一个接口。现在看前端,因为查询功能,前端需要模糊查询,而且还有分页,这个功能咋实现
首先我们要知道,我们可以在settings.py里面配置每页显示的数量
搜索结果每页显示数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 3
前端往后端传的名称,必须是q
因为要实现分页功能,所以,我们先看接口返回的是什么
一个是自己封装的,一个是人家的,所以我们要实现分页,就需要用他的东西
{% if context.page.has_previous %}<li class="previous"><ahref="?q={{ context.query }}&page={{ context.page.previous_page_number }}">上一页</a></li>{% else %}<li class="previous disabled"><a href="#">上一页</a></li>{% endif %}第 {{ context.page.number }} / {{ context.page.paginator.num_pages }}页{% if context.page.has_next %}<li class="next"><ahref="?q={{ context.query }}&page={{ context.page.next_page_number }}">下一页</a></li>{% else %}<li class="next disabled"><a href="#">下一页</a></li>{% endif %}
以上就实现了前后端的分离,与集成,如何判断他一定就是查询的es,而不是mysql,我们可以将mysql数据改了,看下查询出来的是什么,如果还是原来的,就是查询了es了,除非你重新更新了es了
Django整合ElasticSearch,实现数据的快速检索(有代码)相关推荐
- Elasticsearch 为什么能做到快速检索?— 倒排索引的秘密
来源:https://ricstudio.top/archives/es-lucene-reverted-index "All problems in computer science ca ...
- 【数据篇】SpringBoot 整合 Elasticsearch 实践数据搜索引擎
写在最前 Elasticsearch 入门必读 Docker安装ELK Spring Data Elasticsearch 参考文档 版本选择 Spring Data Release Train Sp ...
- elasticsearch 分页_[Springboot实战系列]整合ElasticSearch实现数据模糊搜索
前言 本文介绍了如何整合搜索引擎elasticsearch与springboot,对外提供数据查询接口. 业务介绍 我的个人网站需要对mysql数据库内存储的京东商品进行模糊查询(模仿淘宝商品搜索), ...
- es java_java整合ElasticSearch导入数据到es中
实体类:利用注解建立实体类会自动根据实体类创建索引,不需要自己建立mapping package com.msic.mall.search.domain; import lombok.AllArgsC ...
- kafka mysql 迁移_一种Kafka与Elasticsearch数据库数据的互相迁移方法与流程
本发明属于数据库迁移领域,具体地讲涉及一种kafka与elasticsearch数据库数据的互相迁移方法. 背景技术: 实现数据共享,可以使更多的人更充分地使用已有数据资源,减少资料收集.数据采集等重 ...
- Spring Boot(九):整合elasticsearch并使用logstash同步数据
一到周末,就想在家里躺尸,逛逛B站,看看直播,打打游戏,美哉美哉.当然,作为一名有自我修养的程序员,学习也是必不可少的.前段时间,我司的另一个项目组接手的项目中用到了elasticsearch,我就查 ...
- Elasticsearch 如何做到快速检索 - 倒排索引的秘密
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://ricstudio.top/archives/es-lucene-reverted-index 一.前言 最近 ...
- Elasticsearch 如何做到快速检索?
" 最近接触的几个项目都使用到了 Elasticsearch (以下简称 ES ) 来存储数据和对数据进行搜索分析,就对 ES 进行了一些学习.本文整理自我自己的一次技术分享. 本文不会关注 ...
- Elasticsearch学习--索引快速检索
如何快速检索? Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤.特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询.倒排索引很 ...
最新文章
- 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程,你收集全了吗?
- 北大数院校友最新成果登数学四大顶刊,偏微分方程突破,可用于W-GAN,现已回国任教中科大...
- DotNetCore跨平台~xUnit和测试报告
- 数字调相用计算机实现的步骤,第2章数据通信习题
- jQuery 实现上下,左右滑动
- linux通过html显示图片,如何在Linux上将HTML页面转化成Png图片?
- 对特朗普获胜感到意外? 那你是被社交媒体迷惑了
- jQuery File Upload blueimp with struts2 简单试用
- NetAssist 网络助手
- 帝骑k触屏模拟器_假面骑士decade神主牌模拟器手机版下载|
- 动量法与指数加权移动平均
- GraphPB:Graphical representations of prosody boundary in speech synthesis论文阅读
- LTE(4G) ATTACH流程
- MIT6.824 2022 Fault-tolerant Key/Value Service
- 如何用annie在B站下载视频?
- 一位真正的科学思想家: 纪念人工智能之父Marvin Minsky教授
- 华为路由器hilink怎么用_HUAWEI HiLink 两个华为路由器无线中继实测效果【图解】...
- [预训练语言模型专题] 银色独角兽GPT家族
- 秦储数字藏品平台正式上线公测 | 实名注册用户首日突破2万!
- 为什么有些 985、211 的本科学生即使在大学里混得很水,在找工作时学历却那么管用?...