Django postgress - 动态SearchQuery对象创建

时间:2018-03-13 13:20:15

标签: django postgresql django-postgresql

我有一个应用程序,允许用户搜索+/- 100,000文档的数据库中的关键字/句子。

我正在使用Django 1.11和documentation

中描述的Postgres FullTextSearch功能

但是,我遇到了以下问题,我想知道是否有人知道解决方案: 我想为提供的查询集中的每个单词创建一个SearchQuery object,如下所示:

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 个答案:

答案 0 :(得分:1)

我从未使用它,但要进行动态查询,您可以循环添加。

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

但文档告诉我们

  

默认情况下,用户提供的所有单词都通过词干分析算法传递,然后查找所有结果词的匹配项。

你确定需要这个吗?