Django对接elasticsearch实现全文检索的示例代码
作者:劲风君 发布时间:2023-07-02 01:31:29
标签:Django,elasticsearch,全文检索
目录
前言
第一步:首先安装相关的依赖包
第二步:在django项目配置文件settings.py中注册应用
第三步:在django项目配置文件settings.py中指定搜索的后端
第四步:创建索引类
第五步:在templates目录中创建text字段使用的模板文件
第六步:手动更新索引
第七步:创建haystack序列化器
第八步:创建视图类
第九步:添加路由
第十步:结果
前言
说到搜索,第一时间想到的是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=测试
来源:https://juejin.cn/post/6991354297728368648
0
投稿
猜你喜欢
- 前言在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEve
- ASP实例代码,利用SQL语句动态创建Access表。留作参考,对在线升级数据库有用处.<% nowtime = now()
- 了解如何在sublime编辑器中安装python软件包,以实现自动完成等功能,并在sublime编辑器本身中运行build。安装Sublim
- 为了给导航栏添加响应式特性,您要折叠的内容必须包裹在带有 classes .collapse、.navbar-collapse 的 <
- 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进
- 基础代码pred_y = test_output.data.numpy()pred_y = pred_y.flatten()print(pr
- DATAFRAME中使用iat[1,0]和iloc[0,1]对元素进行修改。a = [("hahaha",1),(&qu
- 01 实现我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,
- 事件调度sched 模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。class sched.scheduler(timef
- 背景:使用python脚本传递参数在实际工作过程中还是比较常用,以下提供了好几种的实现方式:一、使用sys.argv的数组传入说明:使用sy
- 列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果 =&
- 一. 元组元组是Python中的一个内置的数据结构,它是一个不可变的序列,所谓的不可变序列就是不可以进行增删改的操作。1.1 元组的创建元组
- 问题:如何保护自己的ASP源代码不泄露? 答:下载微软的Windows Script Encoder,对ASP的脚本和客户端javascri
- 前言:本文的主要内容是介绍Python中 if 语句及其使用,包括条件测试、if -else 语句、if -elif-else 语句以及使用
- 本文实例讲述了Golang排列组合算法问题之全排列实现方法。分享给大家供大家参考,具体如下:【排列组合问题】一共N辆火车(0<N<
- 引言在做科学计算或者模拟仿真的时候,相信不少小伙伴会遇到这样的问题,比如,我们有一个一维数组如下所示:array = [1, 2, 3, 4
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较
- 废话不多说,上代码看吧!'''为了避免截断中文字符 文件要求是 unicode 编码 txt文件另存为对话框下面有下
- 导言:在前面的3章里我们为处理二进制数据添加了很多的功能。我们首先在表Categories里添加BrochurePath列,并更新了体系结构
- 本篇博客参考Keqi Zhang的文章“A Progressive Morphological Filter for Removing No