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代码调试的几种方法总结
Apr 15 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
Python设计模式之抽象工厂模式
Aug 25 Python
在Python中定义一个常量的方法
Nov 10 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
详解python和matlab的优势与区别
Jun 28 Python
Python中包的用法及安装
Feb 11 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
Python数据库封装实现代码示例解析
Sep 05 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP运行模式的深入理解
2013/06/03 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
php事件驱动化设计详解
2016/11/10 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
react学习笔记之state以及setState的使用
2017/12/07 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
Python中的super用法详解
2015/05/28 Python
python版本的读写锁操作方法
2016/04/25 Python
python中的格式化输出用法总结
2016/07/28 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
会计实习自我鉴定
2013/12/04 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
同事离别感言
2015/08/04 职场文书
车间班组长竞聘书
2015/09/15 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS