Django postgress - динамическое создание объекта SearchQuery

У меня есть приложение, которое позволяет пользователю искать в базе данных +/- 100000 документов по ключевым словам / предложениям.

Я использую Django 1.11 и функции Postgres FullTextSearch, описанные в документации

Однако я столкнулся со следующей проблемой, и мне было интересно, если кто-то знает решение: я хочу создать SearchQuery Объект для каждого слова в поставляемом наборе запросов, например, так:

query typed in by the user in the input field: ['term1', 'term2', 'term3']

 query = SearchQuery('term1') | SearchQuery('term2') | SearchQuery('term3')
 vector = SearchVector('text')
 Document.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank').annotate(similarity=TrigramSimilarity(vector, query).filter(simularity__gt=0.3).order_by('-simularity')

Проблема в том, что я использовал 3 условия для моего запроса в примере, но я хочу, чтобы это число было динамическим. Пользователь также может указать 1 или 10 терминов, но я не знаю, как добавить соответствующий код в назначение запроса.

Я кратко подумал о том, чтобы программа записала что-то вроде этого в пустой документ:

for query in terms:
   file.write(' | (SearchQuery( %s )' % query ))

Но наличие программы на Python для написания кода Python кажется очень запутанным решением. Кто-нибудь знает лучший способ добиться этого?

1 ответ

Я никогда не использовал его, но для выполнения динамического запроса вы можете просто зациклить и добавить.

compound_statement = SearchQuery(list_of_words[0])
for term in list_of_words[1:]:
    compound_statement = compound_statement | SearchQuery(term)

Но документация говорит нам, что

По умолчанию все слова, которые предоставляет пользователь, передаются через алгоритмы стемминга, а затем он ищет совпадения для всех полученных терминов.

ты уверен, что тебе это нужно?

Другие вопросы по тегам