gpt4 book ai didi

django - 用 Django 的 Postgres 全文搜索匹配一个或多个关键字

转载 作者:行者123 更新时间:2023-11-29 12:55:48 24 4
gpt4 key购买 nike

如果我在一个有多个关键词(没有引号)的网站上搜索——比如搜索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 端可实现的东西)获得了我期望的功能?

最佳答案

感谢@Dharshan 为我指明了正确的方向。正如他或她所指出的,SearchQuery 对象的析取将允许匹配任一关键字。此外,要使包含两个关键字的项目位于列表顶部—— 如 Django full text search docs 中所述-- SearchRank 类可以按如下方式使用:

vector = SearchVector('name')
query = SearchQuery('red') | SearchQuery('car')
items = ForSaleItem.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')

关于django - 用 Django 的 Postgres 全文搜索匹配一个或多个关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com