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编写爬虫小程序
May 14 Python
Python去除字符串两端空格的方法
May 21 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
python实现多线程网页下载器
Apr 15 Python
python 重定向获取真实url的方法
May 11 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python上下文管理器全实例详解
Nov 12 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python二元算术运算常用方法解析
Sep 15 Python
Python中logging日志的四个等级和使用
Nov 17 Python
Python爬虫之Selenium实现窗口截图
Dec 04 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
php实现简单文件下载的方法
2015/01/30 PHP
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
django中SMTP发送邮件配置详解
2019/07/19 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python程序需要编译吗
2020/06/19 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
关于护士节的演讲稿
2014/05/26 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
升学宴学生答谢词
2015/01/05 职场文书
介绍信格式
2015/01/30 职场文书
创先争优个人总结
2015/03/04 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
ant design vue的form表单取值方法
2022/06/01 Vue.js