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选择排序算法实例总结
Jul 01 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
Python PIL图片添加字体的例子
Aug 22 Python
python 进程的几种创建方式详解
Aug 29 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
python统计文章中单词出现次数实例
Feb 27 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
python绘制雷达图实例讲解
Jan 03 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
ADODB的数据库封包程序库
2006/12/31 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
让焦点自动跳转
2006/07/01 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
AngularJs每天学习之总体介绍
2017/08/07 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python访问MySQL封装的常用类实例
2014/11/11 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
物业管理计划书
2014/01/10 职场文书
关于环保的标语
2014/06/13 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
汉语拼音教学反思
2016/02/22 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Python学习之迭代器详解
2022/04/01 Python