我有一个名为Poll
的模型类,其中包含title
,description
和tags
字段。我还有PollEntry
班级(related_name=entries
),其中还有title
,description
和tags
。我正在尝试实现文本搜索(使用contrib.postgres.search
)模块。显然有问题是返回按排名返回重复对象排序的搜索,Django文档基本上说"你必须小心",但没有提供任何如何处理这个问题的例子,我有过基本上没有运气在线寻找例子(在SO或其他地方)。
以下代码段似乎可以解决此问题,但我不知道这是否是最有效的方法。任何建议或参考将不胜感激!另外,请注意我在这里使用DRF。
@list_route(methods=['get'])
def search(self, request):
search_query_terms = request.query_params.get('searchQuery').split(' ')
search_vector = SearchVector('entries__tags__name')+\
SearchVector('title')+\
SearchVector('description')+\
SearchVector('tags__name')+\
SearchVector('entries__title')+\
SearchVector('entries__description')
search_query = SearchQuery(search_query_terms[0])
for term in search_query_terms[1:]:
search_query = SearchQuery(term) | search_query
ids = Poll.objects\
.annotate(rank=SearchRank(search_vector, search_query))\
.order_by('-rank')\
.filter(rank__gt=0)\
.values_list('id')
polls = Poll.objects.filter(id__in=ids)
serializer = self.get_serializer(polls, many=True)
return Response(
data=serializer.data
)