我使用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全文搜索前缀?
答案 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 可能会有所帮助。