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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
在Python程序中操作文件之flush()方法的使用教程
May 24 Python
Python 处理数据的实例详解
Aug 10 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Python绘制频率分布直方图的示例
Jul 08 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
超详细Python解释器新手安装教程
May 10 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中常用编辑器推荐
2007/01/02 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
详解jQuery中的deferred对象的使用(一)
2016/05/27 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
Vue仿今日头条实例详解
2018/02/06 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
python实现simhash算法实例
2014/04/25 Python
python字典的常用操作方法小结
2016/05/16 Python
详解python中的Turtle函数库
2018/11/19 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
工作中的自我评价如何写好
2013/10/28 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
单位单身证明范本
2014/01/11 职场文书
运动会通讯稿150字
2014/02/15 职场文书
老同学聚会感言
2014/02/23 职场文书
经典演讲稿汇总
2014/05/19 职场文书
保护动物的标语
2014/06/11 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
php修改word的实例方法
2021/11/17 PHP
HDFS免重启挂载新磁盘
2022/04/06 Servers