Django Haystack用户特定的排序

时间:2018-08-04 16:47:35

标签: python django solr django-haystack

我有一大堆Articles。对于每对UserArticle,我都有一个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)。我认为主要时间是用于编写键列表。

有什么办法可以加快速度吗?

0 个答案:

没有答案