Django全文搜索无法匹配部分单词

9
我正在使用Django全文搜索来搜索多个字段,但在使用部分字符串进行搜索时遇到问题。
假设我们有一个名为“示例报告”的报告对象。
vector = SearchVector('name') + SearchVector('author__username')

search = SearchQuery('Sa')

Report.objects.exclude(visible=False).annotate(search=vector).filter(search=search)

以下的QuerySet是空的,但如果我包含完整的单词'Sample',那么报告将会出现在QuerySet中。
是否有任何方法可以使用Django全文搜索中的icontains或前缀匹配?

可能是 https://dev59.com/BqPia4cB1Zd3GeqPynIM 的重复问题。 - Scornwell
我同意这看起来像是一个重复的问题,我很好奇如果这个PR被合并了,是否可能只使用Django ORM https://code.djangoproject.com/ticket/27899 - Bryden Fogelman
2个回答

6

以下内容适用于Django 1.11:

tools = Tool.objects.annotate(
    search=SearchVector('name', 'description', 'expert__user__username'),
).filter(search__icontains=form.cleaned_data['query_string'])

请注意筛选器中的icontains

13
当我尝试使用“SearchQuery”进行搜索查询时,出现了数据库错误:“ERROR: function replace(tsquery, unknown, unknown) does not exist at character 1603,HINT: No function matches the given name and argument types. You might need to add explicit type casts.”。 - Matt

0

@santiagopim的解决方案是正确的,但为了解决Matt的评论,如果您遇到以下错误:

ERROR:  function replace(tsquery, unknown, unknown) does not exist 
at character 1603 HINT:  No function matches the given name 
and argument types. You might need to add explicit type casts.

你需要移除对 SearchQuery 的调用,直接使用普通字符串。

我知道这并没有解决如果你需要使用 SearchQuery 的根本问题,但如果你像我一样只需要快速修复,可以尝试以下方法。


vector = SearchVector('name') + SearchVector('author__username')

# NOTE: I commented out the line below
# search = SearchQuery('Sa')
search = 'Sa'

Report.objects.exclude(visible=False).annotate(search=vector)\
.filter(search__icontains =search)

这个其他答案可能会有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接