Как сделать нечувствительный к случаю поиск в Django с помощью Postgres

У меня есть проект с Django, Django REST Framework и PostgreSQL. И моя цель сделать поиск с определенными условиями:

  • логические операторы (AND, OR, NOT)
  • нечувствительный к регистру
  • оператор like * для поиска по префиксам. som* -> поиск some, somali и т.д.

Моя первая попытка заключалась в использовании полного поиска Postgres с таким типом search_type='websearch'

Все хорошо, но нет оператора *. Поэтому я перешел на поиск сырого типа, и мой класс для поиска теперь выглядит так

class DataSearch(generics.ListAPIView):
    serializer_class = DataSerializer
    
    def get_queryset(self):
        q = self.request.query_params.get('query')
        
        if q:
            vector = SearchVector('research', 'data', 'research__name')
            query = SearchQuery(q, search_type='raw')
            queryset = Data.objects.annotate(search=vector).filter(search=query)
        else:
            queryset = Data.objects.none()
        return queryset

Логический оператор работает, поиск по префиксам работает с :*, но я не знаю, как сделать его нечувствительным к регистру.

Возможно ли сделать этот тип поиска нечувствительным к регистру? Или может быть есть другой вариант?

Попробуйте:

SearchQuery(q, search_type='raw', config='english')

ИЛИ

SearchQuery(q, config='pg_catalog.simple', search_type='raw')

Эта статья содержит более подробную информацию о поиске в Django https://docs.djangoproject.com/en/4.0/ref/contrib/postgres/search/

Вернуться на верх