Как заставить логические И, НЕ работать правильно в полнотекстовом поиске Postgres с помощью Django

У меня есть проект с Django, DRF и PostgreSQL. И мне нужно сделать поиск некоторых данных в этом проекте. В этом поиске мне нужны логические операторы (AND, OR, NOT), поиск по префиксу (например, manch*) и нечувствительность к регистру. Поэтому я решил использовать полнотекстовый поиск PostgreSQL следующим образом

class VariableSearch(generics.ListAPIView):
    serializer_class = VariableSerializer
    
    def get_queryset(self):
        q = self.request.query_params.get('query')
        
        if q:
            vector = SearchVector('name', 'label')
            query = SearchQuery(q, search_type='raw')
            queryset = Variable.objects.annotate(search=vector).filter(search=query)
        else:
            queryset = Variable.objects.none()
        return queryset

Итак, с помощью этого типа поиска я могу делать такие запросы

http://127.0.0.1:8000/search_var/?query=полит:* | инфо:*

Оператор OR и поиск по префиксу работают хорошо.

Но когда я пытаюсь использовать AND (&) на NOT (!), это дает мне результаты без этого логического AND или просто syntax error in tsquery: "word !not" для запросов, подобных этому

http://127.0.0.1:8000/search_var/?query=word !not

Итак, как сделать так, чтобы И и НЕ работали правильно?

добавьте еще один запрос к url

пример:

?word_status=True

Или вы можете использовать 'or', 'and' и получить это значение, чтобы применить его к вашему запросу (в зависимости от него).

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