Django 对接 ElasticSearch 实现全文检索(前后端分离)

这里我选择的是 用腾讯云服务器起es 服务,通过docker拉取es镜像,这样 就不用每次都起es服务了,是不是很香😍

服务器起es服务

第一步:拉取镜像
docker image pull delron/elasticsearch-ik:2.4.6-1.0
第二步:运行容器
docker run -d -p 9200:9200 -p 9300:9300 --name search delron/elasticsearch-ik:2.4.6-1.0

接下来就是django的配置了

Django 配置es

第一步:安装依赖包
pip3 install drf-haystack 
pip3 install elasticsearch
pip3 install djangorestframework
第二步:在django项目配置文件settings.py中注册应用
INSTALLED_APPS = [
    ...
    'app01.apps.App01Config',        
    'haystack',
    'rest_framework'
]
第三步:在django项目配置文件settings.py中指定搜索的后端

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',    # 此处为elasticsearch运行的服务器ip地址和端口
        'INDEX_NAME': 'course',           # 指定elasticserach建立的索引库名称
    },
}

# 搜索结果每页显示数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
# 实时更新index
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
第四步:创建索引model类

在此之前要先创建model类,并插入数据

class TestData(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    cate = models.CharField(max_length=10)

    class Meta:
        db_table = 'testdata'

在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类

我在minapp应用下创建:search_indexes.py


索引模型类的名称必须是 模型类名称 + Index
from haystack import indexes
from .models import TestData


class BookIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        """返回建立索引的模型类"""
        return TestData

    def index_queryset(self, using=None):
        """返回要建立索引的数据查询集"""
        return self.get_model().objects.all()
第五步:在templates目录中创建text字段使用的模板文件

创建文件templates/search/indexes/APP名称/model类名称加上_text.txt文件中定义

在这里插入图片描述

{{ object.title }}
{{ object.content }}

第六步:手动更新索引
python manage.py rebuild_index   #数据库有多少条数据,全部会被同步到es中
第七步:创建saystack序列化器
from drf_haystack.serializers import HaystackSerializer
from rest_framework.serializers import ModelSerializer

from minapp import models

from minapp.search_indexes import TestData, BookIndex


class TestSerializer(ModelSerializer):
    class Meta:
        model = models.TestData
        fields = '__all__'


class TestIndexSerializer(HaystackSerializer):
    object = TestSerializer(read_only=True)  # 只读,不可以进行反序列化

    class Meta:
        index_classes = [BookIndex]  # 索引类的名称
        fields = ('text', 'object')  # text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
第八步:创建视图类
from drf_haystack.viewsets import HaystackViewSet
from minapp.models import TestData
from minapp.mySer import TestIndexSerializer
class BookSearchView(HaystackViewSet):
    index_models = [TestData]

    serializer_class = TestIndexSerializer

第九步:添加路由
'''es '''
from rest_framework import routers
from minapp.views import BookSearchView
router = routers.DefaultRouter()
router.register("es", BookSearchView, basename="book-search")

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hh', Index.as_view()),
    # whoosh
    # path('whoosh/', basic_search),
]

'''es '''
urlpatterns += router.urls
第十步:测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值