我有一大堆Articles
。对于每对User
和Article
,我都有一个Recommendation
,它存储一个自定义分数(和其他一些数据)。
#----- models.py -----
class Article(models.Model):
title = models.CharField(max_length=255, unique=True)
abstract = models.TextField()
journal = models.CharField(max_length=255)
authors = models.TextField()
pubdate = models.DateField(db_index=True)
class Recommendation(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
score = models.FloatField(db_index=True)
# some other fields ...
class Meta:
# Order descending by score
ordering = ["-score"]
我正在使用Haystack和Solr对文章进行全文搜索。但是,我想向用户显示的是通过搜索过滤出来的他们的建议。因此,我对Solr的结果排名不感兴趣。我想根据我的自定义推荐分数来排序结果。问题在于此自定义分数取决于用户。这意味着我不能将其添加到文章索引中,因为它不是单个值,而是与用户数一样多的分数。
我当前的解决方案:
# Get the searched articles
sqs = SearchQuerySet().auto_query(query).load_all()
# Load the keys to all returned articles
result_keys = sqs.values_list('pk', flat=True)
# Get all recommendations belonging to these keys and this user
recommendations = Recommendation.objects.filter(user=self.request.user, article__in=result_keys).select_related('article')
# Setup pagination
context['paginator'] = Paginator(recommendations, items_per_page)
context['page_obj'] = paginator.page(page_nr)
对于一个搜索结果为105378文章的示例,大约需要12秒钟来处理请求。提取所有相应建议仅需600毫秒(根据DjangoDebugToolbar)。我认为主要时间是用于编写键列表。
有什么办法可以加快速度吗?