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 tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
教你使用python画一朵花送女朋友
Mar 29 Python
python生成九宫格图片
Nov 19 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Django的models中on_delete参数详解
Jul 16 Python
Django后台管理系统的图文使用教学
Jan 20 Python
tensorflow 变长序列存储实例
Jan 20 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Python图像读写方法对比
Nov 16 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 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
提问的智慧
2006/10/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PHP实现的日历功能示例
2018/09/01 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
Vue渲染函数详解
2017/09/15 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
js中对象和面向对象与Json介绍
2019/01/21 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
便利店的创业计划书
2014/01/15 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
党的作风建设心得体会
2014/10/22 职场文书
投资入股合作协议书
2014/10/28 职场文书
就业导师推荐信范文
2015/03/27 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS