我想对模型中的两个字段执行全文搜索。这是我当前的代码:
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')
Run Code Online (Sandbox Code Playgroud)
此代码返回错误消息
function similarity(tsvector, unknown) does not exist
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我没有正确组合这些字段,因为当我只用一个字段代替 时vector,它就可以正常工作。如果 pg_trgm 扩展未正确安装,三元组搜索将无法在某一字段上运行,对吧?在多个领域进行搜索的正确方法是什么?
我误读了您的问题,错误显示您已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')
Run Code Online (Sandbox Code Playgroud)
如果你想给“标题”更高的权重,你可以用一个数学函数来增加权重,而不是使用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')
Run Code Online (Sandbox Code Playgroud)
请注意,如果“标题”中与 相关的匹配良好,而“内容”中不匹配Greatest,则后者会降低相似度值,因此您可能需要将阈值设置得较低。
注意2:相似度查看完整的字符串,因此如果您有很长的文本(“内容”)并且只有一个要搜索的关键字,即使该关键字包含在“内容”中,相似度也会返回 0。对于全文搜索,最好SearchRank与 一起使用SearchVector。
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |