Как сделать нечувствительный к случаю поиск в 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/