使用多个单词或部分单词的Search Vector进行Django搜索

use*_*631 6 python django django-queryset

对于搜索,我想使用PostgreSQL的搜索矢量;

我写了一个自定义查询方法:

  def search(self, text):

        search_vectors = (
            SearchVector('name', weight='A', config='english') +
            SearchVector('short_description', weight='B', config='english') +
            SearchVector('description', weight='C', config='english')
        )
        search_query = SearchQuery(text)
        search_rank = SearchRank(search_vectors, search_query, weights=[0.2, 0.4, 0.6, 1])

        return self.annotate(rank=search_rank).filter(rank__gte=0.2).order_by('-rank').
Run Code Online (Sandbox Code Playgroud)

有2个“问题”。例如,如果搜索“ Eric”名称,则:

  • 'eric'我得到正确的结果
  • '艾里克·约翰'我没有结果
  • 'eri'我没有结果

我有点理解为什么它会失败,但是我不知道如何实施这些修复程序。

小智 1

如果我理解正确的话,您想要进行部分搜索那么,为此,您只需将 * 粘贴到查询末尾并发送它就足够了,您将找到结果。

.
.    
search_query = SearchQuery(text + '*')
.
.
Run Code Online (Sandbox Code Playgroud)

当然,如果你想包含用户的查询,你可以将查询放在两个*之间,如下所示,然后发送。

.
.
search_query = SearchQuery('*' + text + '*')
.
.
Run Code Online (Sandbox Code Playgroud)

要了解它是如何工作的,请阅读以下答案 /sf/answers/3106746261/