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程序
Apr 04 Python
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Django之模型层多表操作的实现
Jan 08 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
python分割一个文本为多个文本的方法
Jul 22 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 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/28 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
JS数学函数Exp使用说明
2012/08/09 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
安全员岗位职责
2013/11/11 职场文书
学校后勤岗位职责
2014/02/19 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
勤俭节约主题班会
2015/08/13 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书