Django Queryset icontains () метод не возвращает точное совпадение - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь отфильтровать модель, передав текстовый запрос и проверив, содержит ли какое-либо из полей значение, которое полностью или частично соответствует данному текстовому запросу.

Допустим, у меня есть модель с именем Sample, которая содержит поля символов ["name", "state", "type"]. Предполагая, что один из объектов модели имеет значение state для установки "barely alive"

Я посмотрел на методы, описанные в следующем документе django: https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/search/

Я хочу получить этот объект, используя любой из "barely", "arely" или "barely alive" в качестве текстового запроса.

Я изначально пробовал что-то вроде Sample.objects.annotate(search=SearchVector(*list_of_fields)).filter(search__icontains=query_text)

Однако над строкой не будет возвращаться правильный набор запросов, если я передам полный текст barely alive в качестве текста запроса и будет работать только при передаче неполного текста, такого как barely или alive.

Так что я тогда попробовал Sample.objects.annotate(search=SearchVector(*list_of_fields)).filter(search=query_text).filter(search__icontains=query_text) Но затем он возвращает пустой Queryset.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 28 марта 2019

Полнотекстовый поиск в PostgreSQL имеет довольно много сложностей в отношении частичного соответствия, см., Например, здесь и здесь .

Однако, если вы можете обойтись сзапрос OR, как вы и пытались, не сложен, вам просто нужен правильно сконструированный объект Q вместо двух цепочек вызовов filter (поскольку в цепочке фильтров используется AND, а не OR).Поэтому вместо

.filter(search=query_text).filter(search__icontains=query_text)

используйте

.filter(Q(search=query_text) | Q(search__icontains=query_text))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...