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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python压缩和解压缩zip文件
Feb 14 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
Python基础教程之利用期物处理并发
Mar 29 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
Python 编程速成(推荐)
Apr 15 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
python Django框架快速入门教程(后台管理)
Jul 21 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
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
定义select的边框颜色
2008/04/28 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
影响jQuery使用的14个方面
2014/09/01 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
使用python存储网页上的图片实例
2018/05/22 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
韩国11街:11STREET
2018/03/27 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
学生自我鉴定模板
2013/12/30 职场文书
社区服务标语
2014/07/01 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
golang操作rocketmq的示例代码
2022/04/06 Golang
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS