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 getopt模块处理命令行选项实例
May 13 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
详解django.contirb.auth-认证
Jul 16 Python
Python函数参数操作详解
Aug 03 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
python process模块的使用简介
May 14 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 高级课程笔记 面向对象
2009/06/21 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
js下拉菜单语言选项简单实现
2013/09/23 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
详解VUE 数组更新
2017/12/16 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
python装饰器与递归算法详解
2016/02/18 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
Python操作json的方法实例分析
2018/12/06 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
模具毕业生推荐信
2014/02/15 职场文书
给校长的建议书400字
2014/05/15 职场文书
党建目标管理责任书
2014/07/25 职场文书
Javascript webpack动态import
2022/04/19 Javascript