2

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

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

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

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

4

1 回答 1

0

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

但是如果你做类似的事情

results = [ r.pk for r in searchqueryset ]

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

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

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

于 2011-04-28T01:14:16.610 回答