Django对接elasticsearch实现全文检索的示例代码


Posted in Python onAugust 02, 2021

前言

说到搜索,第一时间想到的是mysql数据库的like语句

但是,假如你的数据库有几千万条数据,name字段没有索引,可能查询需要十几分钟,用户可能会等你?那为什么不给name字段增加索引?数据表不仅仅是用来查询,也会经常修改数据,新增删除数据等。建立索引后,做增删改操作时也会大大占用数据库资源。所以应该怎么解决呢?

Elasticsearch!

一个强大的基于Lucene的全文搜索服务器!维基百科、Stack Overflow、Github都在用。

如果想详细了解其原理的话,可以参考:https://www.elastic.co/guide/index.html

第一步:首先安装相关的依赖包

pip install drf-haystack 
pip install elasticsearch 
pip install djangorestframework

第二步:在django项目配置文件settings.py中注册应用

INSTALLED_APPS = 
[
'app.apps.AppConfig', 
'haystack', 
'rest_framework'
]

第三步:在django项目配置文件settings.py中指定搜索的后端

HAYSTACK_CONNECTIONS = { 
'default':    {
            'ENGINE':'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
            'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200 
            'INDEX_NAME': 'test', # 指定elasticsearch建立的索引库的名称 
            }, 
            } 
# 当添加、修改、删除数据时,自动生成索引 
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 
# 指定搜索结果每页的条数 
# HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1

第四步:创建索引类

在此之前要先创建model类,并插入数据

from django.db import models 
class Es(models.Model): 
    name=models.CharField(max_length=32)
    desc=models.CharField(max_length=32)

在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类
我在app应用下创建:search_indexes.py

# 索引模型类的名称必须是 模型类名称 + Index 
from haystack import indexes 
from .models import Es 
class EsIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    def get_model(self): 
    """返回建立索引的模型类""" 
        return Es 
    def index_queryset(self, using=None): 
    """返回要建立索引的数据查询集""" 
        return self.get_model().objects.all()

第五步:在templates目录中创建text字段使用的模板文件

创建文件templates/search/indexes/app/es_text.txt文件中定义

{{ object.name }} 
{{ object.desc }}

第六步:手动更新索引

python manage.py rebuild_index   #数据库有多少条数据,全部会被同步到es中

第七步:创建haystack序列化器

from drf_haystack.serializers 
import HaystackSerializer 
from rest_framework.serializers 
import ModelSerializer from app 
import models 
from app.search_indexes import EsIndex 
class EsSerializer(ModelSerializer): 
    class Meta: 
        model=models.Es 
        fields='__all__' 
class EsIndexSerializer(HaystackSerializer): 
     object = EsSerializer(read_only=True) # 只读,不可以进行反序列化 
     class Meta: 
        index_classes = [EsIndex]# 索引类的名称 
        fields = ('text', 'object')# text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text

第八步:创建视图类

from drf_haystack.viewsets 
import HaystackViewSet 
from app.models import Book 
from app.serializers import EsIndexSerializer 
class EsSearchView(HaystackViewSet): 
    index_models = [Es] 
    serializer_class = EsIndexSerializer

第九步:添加路由

from django.conf.urls 
import url from django.contrib 
import admin 
from rest_framework import routers 
from app.views import EsSearchView 
    router = routers.DefaultRouter() 
    router.register("book/search", EsSearchView, base_name="book-search") 
    urlpatterns = [ url(r'^admin/', admin.site.urls), ] 
    urlpatterns += router.urls

第十步:结果

http://127.0.0.1:8000/?text=测试

到此这篇关于Django对接elasticsearch实现全文检索的示例代码的文章就介绍到这了,更多相关Django elasticsearch实现全文检索内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
django 连接数据库 sqlite的例子
Aug 14 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python递归实现打印多重列表代码
Feb 27 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
python爬取音频下载的示例代码
Oct 19 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
Python操作Excel的学习笔记
Feb 18 Python
Python四款GUI图形界面库介绍
Jun 05 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 #Python
python数字转对应中文的方法总结
Aug 02 #Python
Python List remove()实例用法详解
Aug 02 #Python
Python中基础数据类型 set集合知识点总结
Aug 02 #Python
python unittest单元测试的步骤分析
Aug 02 #Python
python元组打包和解包过程详解
Aug 02 #Python
python字典进行运算原理及实例分享
Aug 02 #Python
You might like
PHP动态变静态原理
2006/11/25 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
Laravel5中contracts详解
2015/03/02 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
Python contextlib模块使用示例
2015/02/18 Python
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
python异常和文件处理机制详解
2016/07/19 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
python实现爬山算法的思路详解
2019/04/09 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
用友笔试题目
2016/10/25 面试题
元旦联欢会策划方案
2014/06/11 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
教师教育心得体会
2016/01/19 职场文书
学习nginx基础知识
2021/09/04 Servers