Django全文搜索不匹配部分单词

时间:2017-08-04 23:10:21

标签: python django search full-text-search psql

我使用Django全文搜索来搜索多个字段,但在使用部分字符串进行搜索时出现问题。

假设我们有一个名为' Sample Report'的报告对象。

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

search = SearchQuery('Sa')

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

以下QuerySet为空,但如果我包含完整的单词' Sample'然后报告将出现在QuerySet中。

是否有使用icontains或django全文搜索前缀?

2 个答案:

答案 0 :(得分:0)

这适用于Django 1.11:

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

请注意过滤器中的icontains

答案 1 :(得分: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)

这个 other answer 可能会有所帮助。