【发布时间】:2018-07-15 15:16:19
【问题描述】:
这是必须搜索的模型:
class BlockQuote(models.Model):
debate = models.ForeignKey(Debate, related_name='quotes')
speaker = models.ForeignKey(Speaker, related_name='quotes')
text = models.TextField()
我的笔记本电脑上的数据库中有大约一千个实例(生产服务器上大约有 50000 个)
我正在创建一个“manage.py”函数,它将搜索数据库并返回其文本字段包含关键字的所有“BlockQuote”对象。
我正在使用 Django 的 (1.11) Postgres 搜索选项来执行此操作,以便使用 'rank' 属性,这听起来会派上用场。 I used the official Django fulltext-search documentation for the code below
然而,当我运行此代码时,它与所有对象匹配,无论 BlockQuote.text 是否实际包含查询字段。
def handle(self, *args, **options):
vector = SearchVector('text')
query = options['query'][0]
Search_Instance = Search_Instance.objects.create(query=query)
set = BlockQuote.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
for result in set:
match = QueryMatch.objects.create(quote=result, query=Search_Instance)
match.save()
有人知道我做错了什么吗?
【问题讨论】:
-
我自己对排名搜索不是很熟悉,但是在阅读了一些文档之后,我觉得我要么需要更多代码,要么不得不问:SearchQuery 应该通过
objects.create(query=query)初始化,而不仅仅是SearchQuery(query)(这是我在文档和其他随机教程中使用的方式,也没有query=),也许问题是初始化(?) -
抱歉造成混淆,SearchQuery 是一个单独的数据库对象,我用它来将所有结果链接到相关搜索。名称虽然接近 django 方法 - 所以我在示例(和我的代码)中更改了名称 感谢您的回复!
标签: django postgresql full-text-search