Django结合Elasticsearch实现全文检索的完整指南

Theo
Theo
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍如何在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结合的内容,欢迎查阅本站历史文章或继续阅读后续相关教程,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表