模型类型上的 Django Haystack 分面

发布于 2024-11-26 04:48:46 字数 47 浏览 1 评论 0原文

我想根据返回的不同模型名称(类)对结果进行分面。有没有简单的方法可以做到这一点?

I want to facet the results based on the different model_names (classes) returned. Is there an easy way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌能量女王 2024-12-03 04:48:46

您是否尝试过添加包含此信息的 SearchIndex 字段?例如

class NoteIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Note

    def prepare_facet_model_name(self, obj):
        return "note"


class MemoIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Memo

    def prepare_facet_model_name(self, obj):
        return "memo"

,依此类推,只需为每个搜索索引返回不同的字符串。您还可以创建一个 mixin 并返回 get_model 返回的模型的名称。

假设您已将此字段添加到每个 SearchIndex 定义中,只需 facet 方法链接到您的结果。

results = form.search().facet('facet_model_name')

现在,facet_counts 方法将返回一个字典,其中包含分面字段和每个分面值的结果计数(在本例中为模型名称)。

请注意,此处的字段被详细标记,以避免与 Haystack 添加的字段 model_name 可能发生冲突。它不是多面的,我不确定复制它是否会导致冲突。

Have you tried adding a SearchIndex field with this information? E.g.

class NoteIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Note

    def prepare_facet_model_name(self, obj):
        return "note"


class MemoIndex(SearchIndex, indexes.Indexable):
    title = CharField(model_attr='title')
    facet_model_name = CharField(faceted=True)

    def get_model(self):
        return Memo

    def prepare_facet_model_name(self, obj):
        return "memo"

And so on, simply returning a different string for each search index. You could also create a mixin and return the name of the model returned by get_model too.

Presuming you've added this field to each of your SearchIndex definitions, just chain the facet method to your results.

results = form.search().facet('facet_model_name')

Now the facet_counts method will return a dictionary with the faceted fields and count of results for each facet value, in this case, the model names.

Note that the field here is labeled verbosely to avoid a possible conflict with model_name, a field added by Haystack. It's not faceted, and I'm not sure if duplicating it will cause a conflict.

格子衫的從容 2024-12-03 04:48:46

如果您只想过滤模型类型,可以使用 模型搜索表​​单

If you just want to filter on the model type, you can use the ModelSearchForm

篱下浅笙歌 2024-12-03 04:48:46

文档对此有一个非常好的演练。

您至少需要:

  1. faceted=True 添加到 model_names 字段的参数中。
  2. 重建您的架构和索引。
  3. .facet('model_names') 添加到您想要分面的任何 SearchQuerySet 中。

对问题的更多解释将使答案更完整。

The Docs have a really good walk-through for this.

The minimum you'll need:

  1. is to add faceted=True to the params of your model_names field.
  2. Rebuild your schema and indices.
  3. add .facet('model_names') to whatever SearchQuerySet you're wanting to facet.

More explanation on the question would enable a more complete answer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文