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 isinstance判断对象类型
Sep 06 Python
初学Python实用技巧两则
Aug 29 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
Python实现控制台输入密码的方法
May 29 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python3 读取Excel表格中的数据
Oct 16 Python
Python构建图像分类识别器的方法
Jan 12 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python 远程统计文件代码分享
2015/05/14 Python
Python缩进和冒号详解
2016/06/01 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
python字典排序的方法
2019/10/12 Python
Django日志及中间件模块应用案例
2020/09/10 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
领导检查欢迎词
2014/01/14 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
工程负责人任命书
2014/06/06 职场文书