Django Haystack/Solr:模型上的分面,但仅显示来自外键字段的结果

发布于 2024-10-26 23:47:23 字数 683 浏览 4 评论 0原文

我在 Django 中有两个模型,如下所示(伪代码)

class Medicine(db.Model):
    field_1 = db.CharField()
    field_2 = db.CharField()

class Application(db.Model):
    field_1 = db.CharField()
    field_2 = db.CharField()
    medicine = db.ForeignKey(Medicine)

有一个 1:M。一种药物可以有多种用途。

我需要对 Application 字段进行分面,但只显示相关的 Medicine 对象。类似于 SQL 中的 DISTINCT。

使用 haystack 实现此目的最直接的方法是什么?

我是否为 MedicineApplication 创建 SearchIndex?如果我为 Application 创建 SearchIndex,如何检测/过滤重复的 Medicine 对象?

PS:我知道 Solr 的开发版本中有字段折叠功能,但我想避免这样做,因为它是巨大的数据库并且性能至关重要。

I have two models in Django like follows(in pseudo code)

class Medicine(db.Model):
    field_1 = db.CharField()
    field_2 = db.CharField()

class Application(db.Model):
    field_1 = db.CharField()
    field_2 = db.CharField()
    medicine = db.ForeignKey(Medicine)

There is a 1:M. One medicine can have many applications.

I need to facet on the fields of Application but only show related Medicine objects. Something like DISTINCT in SQL.

What would be the most straight forward way to accomplish this with haystack?

Do I make SearchIndex for Medicine or Application? If I make SearchIndex for Application, how do I detect/filter duplicate Medicine objects?

PS: I know there's Field Collapsing feature in dev releases of Solr, but I want to avoid doing that, becuase it is huge database and performance critical.

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

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

发布评论

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

评论(1

給妳壹絲溫柔 2024-11-02 23:47:23

我在 haystack 邮件列表上的 Daniel Lindsay(Haystack/pySolr 作者)的帮助下解决了这个问题。

from haystack import indexes

class Medicine(indexes.SearchIndex):
    field_1 = indexes.MultiValuedField(faceted=True)
    # Other field definitions


    def prepare_field_1(self, object):
        values = list()
        for app in object.applications.all():
            values.append(app.field_on_which_to_facet)
        return values

    # define "prepare_fieldname" methods for other fields in similar fashion.

索引需要一些时间,因为要索引的数据非常庞大,但工作起来很顺利。

I solved this with the help of Daniel Lindsay(Haystack/pySolr author) on haystack mailing list.

from haystack import indexes

class Medicine(indexes.SearchIndex):
    field_1 = indexes.MultiValuedField(faceted=True)
    # Other field definitions


    def prepare_field_1(self, object):
        values = list()
        for app in object.applications.all():
            values.append(app.field_on_which_to_facet)
        return values

    # define "prepare_fieldname" methods for other fields in similar fashion.

Indexing takes some time as the data to be indexed is huge is huge, but worked like a charm.

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