【问题标题】:django-haystack: choosing a large SearchIndex over an Indexed DBdjango-haystack:在索引数据库上选择一个大的 SearchIndex
【发布时间】:2011-08-07 03:59:13
【问题描述】:

我有一个包含 35 个字段(Char、Int、Bool、Dec、M2M、FK)的 UserProfile 模型。作为搜索视图功能的一部分,其中一个字段需要全文搜索,而其余 34 个字段将用于提供“高级搜索过滤”(使用:__gte、__lte、__exact、__in、__startswith)。 “搜索”查询可以使用 5-35 个字段作为搜索视图条件。

我正在使用 haystack 构建 SearchIndex,目前已添加所有 35 个字段,但这似乎无效,因为我绕过了 django ORM (?)。

来自Filter Django Haystack results like QuerySet? 的回答建议我可以将单个全文搜索字段存储在 SearchIndex 中,并将 SearchQuerySet 与 django 的 QuerySet 组合用于剩余的 34 个过滤器字段。然后我会在我的 django 模型中的部分或全部这些字段上使用 db_index=True 吗?使用这种两阶段查询合并方法能否很好地扩展到数千个结果?

由于我的 UserProfile 模型可以增长到 300K-2M 条目,我正在尝试了解如何最好地索引此模型。作为数据库索引和搜索的新手,我正在寻找有关如何最好地优化我的数据库的任何见解。

【问题讨论】:

    标签: django indexing full-text-indexing django-haystack


    【解决方案1】:

    将两者混合可能无法扩展。当您构建查询集或 SearchQuerySet 时,查询实际上不会运行,直到您在某处请求结果,所以从这个意义上说它们是懒惰的。

    但是如果你做类似的事情

    results = [ r.pk for r in searchqueryset ]

    它实际上是针对 haystack/solr 执行该查询。如果您总共查看 200 万个条目,这意味着您的列表可能会返回 200 万个条目。现在您正在向 MySQL(使用 ORM)发送一个 2M 列表以进行进一步过滤。这永远不会明显扩大。

    如果你只是坚持干草堆然后继续构建你的搜索查询集,它只会在访问结果时执行一次。还要记住减少 {{ result.object }},因为这也会影响每个结果的数据库。

    您可以查看 load_all()、faceting 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多