drf_haystack搜索关键字-总结

setting中注册

INSTALLED_APPS = [
    ....
    # 全文检索(尽量放在最下方)
    'haystack',
]

# Haystack
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://本机ip:9200/',  # Elasticsearch服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'tenth_power',  # Elasticsearch建立的索引库的名称
    },
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# # 可以在 dev.py 中添加如下代码, 用于决定每页显示数据条数:
# HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

创建search_indexes.py文件(命名不能改变)

from haystack import indexes
from Headlines.models import Article


class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
    """文章索引模型类"""
    text = indexes.CharField(document=True, use_template=True)
    content = indexes.CharField(model_attr="content")

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

    def index_queryset(self, using=None):
        """返回要建立索引的数据查询集"""
        return self.get_model().objects.all()

建立模板文件,这里article_text.txt(模型类名小写_text.txt)
在这里插入图片描述
在这里插入图片描述

views视图

from Headlines.serializers import SearchArticleIndexSerializer
from drf_haystack.viewsets import HaystackViewSet
# 搜索文章
class SearchArticleViewSet(HaystackViewSet):
    # 权限:所有用户
    # GET  /articles/search/?text=<搜索关键字>
    # 这里可以写多个模型,相应的:serializer里也可以写多个index_classes
    index_models = [Article]
    serializer_class = SearchArticleIndexSerializer

serializer.py序列化器文件中

from .models import Article
from drf_haystack import serializers as HSER
from .search_indexes import ArticleIndex


# 搜索文章序列化器类
class SearchArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        # 返回除了搜索字段外的所需要的其他字段数据, 可以将所有需要返回的字段数据写上,便于提取
        fields = ('id', 'title', 'createtime')


# 搜索文章
class SearchArticleIndexSerializer(HSER.HaystackSerializer):
    # 变量名称必须为 object 否则无法返回
    object = SearchArticleSerializer(read_only=True)

    class Meta:
        index_classes = [ArticleIndex]  # 索引类的名称,可以有多个
        # text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
        fields = ('text', 'object', 'content')

urls 路由配置文件

# 搜索文章路由
from rest_framework.routers import DefaultRouter
from Headlines.views import SearchArticleViewSet

router = DefaultRouter()
router.register(r'articles/search', SearchArticleViewSet, base_name='search')
urlpatterns += router.urls

最后建立索引

python manage.py rebuild_index
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值