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编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
python类装饰器用法实例
Jun 04 Python
在Python中的Django框架中进行字符串翻译
Jul 27 Python
Python ftp上传文件
Feb 13 Python
Python之str操作方法(详解)
Jun 19 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
Python中单例模式总结
Feb 20 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
Python 实现自动导入缺失的库
Oct 29 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
教你怎么用Python生成九宫格照片
May 20 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
Laravel框架创建路由的方法详解
2019/09/04 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
javascript中this指向详解
2016/04/23 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python查询sqlite数据表的方法
2015/05/08 Python
python操作列表的函数使用代码详解
2017/12/28 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
大学生志愿者活动总结
2014/06/27 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
会计专业求职信
2014/08/10 职场文书
冰雪公主观后感
2015/06/16 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
Python基于百度API识别并提取图片中文字
2021/06/27 Python