Django结合Elasticsearch实现全文检索的完整指南
本文详细介绍如何在Django项目中集成Elasticsearch以实现高效全文检索。通过安装drf-haystack依赖,配置Django settings,定义索引类与序列化器,并创建视图与路由,最终实现从数据库到Elasticsearch的自动索引同步与查询功能。
前言
提到搜索功能,很多人首先联想到的是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结合的内容,欢迎查阅本站历史文章或继续阅读后续相关教程,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









