django - 对模型中的多个字段执行全文搜索(Django 2.1)
问题描述
我想对模型中的两个字段执行全文搜索。这是我当前的代码:
if 'keyword' in request.GET:
search_term = request.GET['keyword']
vector = SearchVector('Title', weight='A') + SearchVector('Content', weight='B')
articles = articles.annotate(similarity=TrigramSimilarity(vector, search_term),).filter(similarity__gt=0.01).order_by('-similarity')
此代码返回错误消息
function similarity(tsvector, unknown) does not exist
我认为这是因为我没有正确组合字段,因为当我只将一个字段代替 时vector
,它可以正常工作。如果 pg_trgm 扩展没有正确安装,trigram 搜索就不能在一个字段上工作,对吧?在多个领域进行搜索的正确方法是什么?
解决方案
我误读了您的问题,错误显示您已similarity
安装功能,但表示您不能将搜索向量与该similarity
功能一起使用。由于要搜索相似度高于阈值的模式,因此可以分别计算每个字段的相似度并返回最大值。您不能将它们与等级结合起来。尝试这个:
from django.db.models.functions import Greatest
articles.annotate(
similarity=Greatest(
TrigramSimilarity('Title', search_term),
TrigramSimilarity('Content', search_term)
)).filter(similarity__gte=0.1).order_by('-similarity')
如果你想给“标题”更高的权重,你可以用一个数学函数来增加权重,而不是使用Greatest
:
A = 1.0; B = 0.4
articles.annotate(
similarity=(A/(A+B) * TrigramSimilarity('Title', search_term)
+ B/(A+B) * TrigramSimilarity('Content', search_term))
).filter(similarity__gte=0.1).order_by('-similarity')
请注意,如果 'Title' 中有很好的匹配,而 'Content' 中没有与 相关的匹配,后者将降低相似度值Greatest
,因此您可能希望将阈值设置得更低。
注意2:相似度查看完整的字符串,因此如果您有很长的文本('Content')并且只有一个关键字要搜索,即使关键字包含在'Content'中,相似度也会返回0。对于全文搜索,最好SearchRank
与SearchVector
.
推荐阅读
- svelte - Svelte - 帮助从 API 解析数据 - 对象 json
- python - 为什么 AND 退出我的 while 循环但 OR 让它运行?
- c# - 如何继承两个或多个具有相同方法名的接口,派生类应进一步继承到C#中的另一个类中
- angular - 绑定
动态形成值 - python - 当数据集的一行有多个标签的可能性时,是否可以训练 BERT 进行句子分类?
- python - discord.py 静音命令运行但不会使用 mod perms 使用户静音
- javascript - Discord.js channels.create 不是构造函数
- java - java Scanner nextDouble() 不接受双精度
- mongodb - MongoDB按月和年统计属性和分组的值
- javascript - javascript数组逻辑无法正确呈现与地图组件的反应