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实现壁纸批量下载代码实例
Jan 25 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Django中的静态文件管理过程解析
Aug 01 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Python selenium自动化测试模型图解
Apr 15 Python
Python Json数据文件操作原理解析
May 09 Python
python各种excel写入方式的速度对比
Nov 10 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 Python
python 制作本地应用搜索工具
Feb 27 Python
Python中的 Set 与 dict
Mar 13 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+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
PHP处理会话函数大总结
2015/08/05 PHP
yii添删改查实例
2015/11/16 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
js实现筛选功能
2020/11/24 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
Python selenium的基本使用方法分析
2019/12/21 Python
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
const和static readonly区别
2013/05/20 面试题
饮料业务员岗位职责
2013/12/15 职场文书
优秀员工评优方案
2014/06/13 职场文书
房产授权委托书范本
2014/09/22 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
2016年元旦主持词
2015/07/06 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server