【问题标题】:Django - Search matches with all objects - even if they don't actually matchDjango - 搜索与所有对象匹配 - 即使它们实际上并不匹配
【发布时间】: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


【解决方案1】:

我没有看到你真正过滤过。

BlockQuote.objects.annotate(...).filter(rank__gte=0.5)

【讨论】:

  • 感谢您的回复,我已将您的代码添加到我的代码集中 = BlockQuote.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.5).order_by(' -rank') 有一些改进,它不再与数据库中的所有对象匹配。但它目前没有任何匹配。即使我正在搜索一个我知道在对象文本中的词。
  • 是的,您需要弄乱排名以及正在评估的内容。我建议用一些术语打印出未经过滤的值,看看你想要什么以及截止点应该在哪里。
猜你喜欢
  • 2011-04-08
  • 2012-12-06
  • 2020-07-17
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多