Лучший способ использовать полнотекстовый поиск в FilterSet django-фильтров? - PullRequest
0 голосов
/ 25 ноября 2018

Мое приложение использует 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']

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

1 Ответ

0 голосов
/ 25 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...