在django-filters的FilterSet中使用全文搜索的最佳方法?

时间:2018-11-25 11:38:37

标签: django django-rest-framework django-filters

我的应用使用rest-frameworkdjango-filter。我使用此FilterSet提供ModelViewSet过滤的文章(date)列表:

from django_filters import rest_framework as filters

class ArticleFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
    end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte') 

    class Meta:
        model = Article
        fields = ['pub_date']

我想在我的应用中添加搜索框,因此我需要另一个过滤器,该过滤器将在我的Article模型中使用全文本搜索。我要搜索的字段是titledescription。我决定像这样添加带有search参数的method字段:

from django_filters import rest_framework as filters
from django.contrib.postgres.search import SearchVector

class ArticleFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
    end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
    search = filters.CharFilter(method='filter_search')

    def filter_search(self, queryset, name, value):
        return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)

    class Meta:
        model = Article
        fields = ['pub_date']

它可以工作,但是我不确定这是使用全文本搜索过滤的最佳方法。我是否缺少某些东西,或者这种方法还可以?

1 个答案:

答案 0 :(得分:1)

对于幼稚的文本搜索来说,这是可以的,在这种情况下,您无需在小型数据库中查找太多文本。

当您进入更大的领域时,您需要为此优化数据库或移至专用搜索引擎,如Solr或ElasticSearch。 Postgres和section一样,在全文搜索方面有mysql