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在命令行下使用google翻译(带语音)
Jan 16 Python
Python实现的RSS阅读器实例
Jul 25 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
Python基础教程之利用期物处理并发
Mar 29 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python修改列表值问题解决方案
Mar 06 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
彻底解决Python包下载慢问题
Nov 15 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 cookies中删除的一般赋值方法
2011/05/07 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
PHP闭包实例解析
2014/09/08 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP 断点续传实例详解
2017/11/11 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
Python sys.argv用法实例
2015/05/28 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python中GIL的使用详解
2018/10/03 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Python识别处理照片中的条形码
2020/11/16 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
MYSQL基础面试题
2012/05/13 面试题
市场营销求职信范文
2014/02/21 职场文书
销售经理竞聘书
2014/03/31 职场文书
高三学生评语大全
2014/04/25 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
四风查摆剖析材料
2014/10/10 职场文书
导游词之西递宏村
2019/12/10 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
nginx共享内存的机制详解
2022/03/21 Servers
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS