Лучший способ использовать полнотекстовый поиск в FilterSet django-filters?

В моем приложении используются rest-framework и django-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. Поля, которые я бы искал, это title и description. Я решил добавить поле 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']

Это работает, но я не уверен, что это лучший способ использования фильтрации полнотекстового поиска. Я что-то упустил или этот подход в порядке?


person vadimb    schedule 25.11.2018    source источник


Ответы (1)


Это нормально для наивного текстового поиска, когда у вас не так много текста для просмотра в небольшой базе данных.

Когда вы попадаете в более крупные области, вам нужно либо оптимизировать свою базу данных для этого, либо перейти на специальную поисковую систему, такую ​​​​как Solr или ElasticSearch. Postgres имеет раздел по полнотекстовому поиску, как и mysql.

person Jason    schedule 25.11.2018