多个SearchVectorFields上的SearchRank



我正在尝试将全文搜索集成到我的应用程序中。参考Django 3.1文档如果我想在几个字段中进行加权搜索,我应该做以下操作:

from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
vector = SearchVector('body_text', weight='A') + SearchVector('blog__tagline', weight='B')
query = SearchQuery('cheese')
Entry.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.3).order_by('rank')

我决定为以后要搜索的文本列添加SearchVectorField,但我认为关于如何使用这些字段的文档还不够好,我找不到任何关于如何与上面的查询相同的参考,但使用SearchVectorField

理想情况下,我想要类似以下的东西

objects = Post.objects.annotate(
rank=SearchRank(
F('title_text_vector', weight='A') + F('body_text_vector', weight='B'),
SearchQuery('keyword1 keyword2 keyword3')
)
)
objects.filter( < MORE QUERIES HERE > )

我找到了一个变通方法,据我所见,它生成的SQL查询与不使用SearchVectorFields的方法相同。

本质上,我只是使用annotate方法查询每个字段,为每个SearchVectorField生成自定义排名,然后手动对其进行加权。不是很可扩展的方法,但适用于我的情况。

search_query = SearchQuery('keyword1 keyword2 keyword3')
posts = Post.objects.annotate(
title_rank=SearchRank(
'title_vector',
query=search_query
)
).annotate(
body_rank=SearchRank(
'body_vector',
query=search_query
)
).annotate(
rank=(self.search_weights['title'] * F('title_rank') +
self.search_weights['body'] * F('body_rank'))
).order_by('-rank')

相关内容

  • 没有找到相关文章

最新更新