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


猜你喜欢
- #!/bin/sh#code by scpman#功能:检查并修复mysql数据库表#将此脚本加到定时中,脚本执行时,等会读库,列出要修复的
- 1 用法说明str.format() 方法通过字符串中的花括号 {} 来识别替换字段从而完成字符串的格式化。1.1 写法简单字段名有三种写法
- 本文实例讲述了php打包压缩文件之ZipArchive方法用法。分享给大家供大家参考,具体如下:前面说到了php打包压缩文件之PclZip方
- Django模板使用两种模板标签,且语法格式与Python代码有些许不同。 为了使得模板访问到标签,需要将 {% load i18n %}
- Expression定义 IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这
- 正则表达式的介绍1)在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱、手机号码等,这时候想匹配或者查找符合某些规则的字
- 这十则CSS技巧汇编于网络,作为老手已经司空见惯了,也没有什么新意,但温故而知新,或许阅读一遍也有一定的启发,本文主要面对CSS新手朋友,有
- #! /usr/bin/python''' File&n
- 目录1.查询字符串数据(query string):2. 提取请求体数据2.1 表单类型请求体数据(Form Data)2.2 非表单类型请
- 我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法。今天,我们来介绍一种时间复杂度为 O (n ^ log 3)
- 本文实例为大家分享了python实现学生信息管理系统的具体代码,供大家参考,具体内容如下1.主要内容python种的.py文件如图所示第一个
- 工作中遇到一个问题,两个字符串匹配,要求:每个字符串中最多含有一个*,?可以无限多个*代表一个任意长度的字符串,而?则代表一个字符要求可以提
- 最近发现了一个宝藏动态可视化库,非常简单,即使是小白也能轻松上手。这个库就是motionchart,它能够用 pandas 的 datafr
- 看下面的例子就明白了class Test(object): def __init__(self, value='hell
- 1.首先,我们需要过滤所有客户端提交的内容,其中包括?id=N一类,另外还有提交的html代码中的操作数据库的select及asp文件操作语
- sql server中变量要先申明后赋值:局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);申明局部变量语法:d
- Web应用的发展,使得客户端存储使用得也越来越多,而实现客户端存储的方式则是多种多样。最简单而且兼容性最佳的方案是Cookie,但是作为真正
- 假设我们已经安装好了tensorflow。一般在安装好tensorflow后,都会跑它的demo,而最常见的demo就是手写数字识别的dem
- 对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成。安装基于传统,我更喜欢采用npm包的形式
- JDBC数据库连接MySQL中建表在终端使用命令mysql -u root -p打开数据库,在数据库操作环境下进行创建数据库,建表等等操作建