【发布时间】:2017-09-20 14:49:46
【问题描述】:
如果我在一个包含多个关键字(且没有引号)的网站上搜索——例如 red car——我的期望是包含“red car”的项目应该排在最前面,然后是包含两个关键字(但不按顺序)的项目,后跟包含其中一个关键字的项目。 (我相信这是类 Lucene 系统中的默认行为,但我已经有一段时间没有使用它们了,所以不能确定。)
我希望 Postgres 全文搜索会自动执行此操作,但我早期的测试表明情况并非如此:
## ASSUME: items in database: <blue car>, <green car>, <red truck>
keywords = "red car"
items = ForSaleItem.objects.filter(name__search=keywords)
## RESULT: items is empty/None, whereas it should have each of
## the items since one keyword matches.
我看到的 hack 是使用 Django 的析取运算符,但我希望有一些不那么 hacky 的东西。我也很确定这个 hack 不会把完全匹配放在列表的顶部。这是黑客:
from django.db.models import Q
keyword_query = Q()
for keyword in keywords.split(' '):
keyword_query.add(Q(name__search=keyword), Q.OR)
items = ForSaleItem.objects.filter(keyword_query)
是否有一些我缺少的设置/API(或在 postgres 端可实现的东西)可以获得我期望的功能?
【问题讨论】:
-
您在寻找多关键词搜索吗?
SearchQuery('red') & SearchQuery('car') # red AND carSearchQuery('red') | SearchQuery('car') # red OR car -
感谢@Dharshan,您让我重新阅读文档并发现您对
SearchQuery('red') | SearchQuery('car')的建议与SearchRank()类的组合实现了我正在寻找的东西。
标签: django postgresql full-text-search