elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack" /> elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack" />

Python Django haystack-如何只搜索项目的子集?

Python Django haystack-如何只搜索项目的子集?,python,django,elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack,我有一些我正在用Django haystack(elasticsearch后端)编制索引的项目可以搜索。这很好,但是用户可以喜欢这些项目,我希望用户能够像搜索所有项目一样搜索他们的收藏夹。收藏夹用多对多直通关系表示,因为当用户收藏某个项目时,我需要记录时间。有没有办法让haystack只搜索用户的收藏夹?我不想为每个用户的收藏夹生成单独的索引,因为它们将是冗余的,因为这些项是相同的,并且已经被主索引索引。以下是我的模型和搜索索引的外观,以供参考: class Gallery(models.Mod

我有一些我正在用Django haystack(elasticsearch后端)编制索引的项目可以搜索。这很好,但是用户可以喜欢这些项目,我希望用户能够像搜索所有项目一样搜索他们的收藏夹。收藏夹用多对多直通关系表示,因为当用户收藏某个项目时,我需要记录时间。有没有办法让haystack只搜索用户的收藏夹?我不想为每个用户的收藏夹生成单独的索引,因为它们将是冗余的,因为这些项是相同的,并且已经被主索引索引。以下是我的模型和搜索索引的外观,以供参考:

class Gallery(models.Model):   
    faves = models.ManyToManyField(
        User, through='Favorite', null=True, related_name="faves")

class Favorite(models.Model):
    user = models.ForeignKey(User)
    gallery = models.ForeignKey(Gallery)
    date = models.DateField(auto_now_add=True)

    class Meta:
        ordering = ["date"]

class GalleryIndex(indexes.SearchIndex, indexes.Indexable):

    def get_model(self):
        return Gallery

谢谢。

您需要查看相关的SearchQuerySet()。但是一定要阅读页面上关于性能影响的警告;我刚刚尝试了这个,它明显比大多数查询慢

你会想要这样的东西:

from django.contrib.auth.models import User
from haystack.query import RelatedSearchQuerySet
from .models import Gallery

u = User.objects.get(...)
sqs = RelatedSearchQuerySet().load_all()
sqs = sqs.load_all_queryset(Gallery, u.faves.all())

这将为您提供一个SearchQuerySet,其中只包含用户的收藏夹,您可以对其进行进一步筛选和搜索。

这可能会有所帮助:这真的适用于此用例吗?据我所见,ES将所有内容存储为平面文档,这是通过关系(用户收藏夹中的项目)进行过滤。我不会将喜欢某个项目的用户存储为数组或其他内容,并将其作为索引参数的一部分。我需要能够通过(user.faves中的对象)之类的方式进行过滤