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)
Но документация говорит нам, что
По умолчанию все слова, которые предоставляет пользователь, передаются через алгоритмы стемминга, а затем он ищет совпадения для всех полученных терминов.
ты уверен, что тебе это нужно?