我有一个包含35个字段的UserProfile模型(Char,Int,Bool,Dec,M2M,FK)。作为搜索视图功能的一部分,其中一个字段需要全文搜索,而其余34个字段将用于提供“高级搜索过滤”(使用:__ gte,__ lte,__ exact,__ in,__ startwith)。 “搜索”查询可以使用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条目,我试图了解如何最好地索引此模型。作为db索引和搜索的新手,我正在寻找有关如何最佳地优化数据库的任何见解。
答案 0 :(得分:0)
混合两者可能无法扩展。当你构建一个查询集或一个SearchQuerySet时,查询实际上并没有运行,直到你在某个地方要求结果,所以他们在这个意义上是懒惰的。
但是,如果你做了像
这样的事情 results = [ r.pk for r in searchqueryset ]
它实际上对haystack / solr执行该查询。如果您总共查看2M条目,则表示您的列表可能会返回2M项目。现在你要向MySQL发送一个2M列表(使用ORM)进行进一步的过滤。这显然不会明显扩大。
如果您只是坚持使用haystack然后继续构建searchqueryset,它只会在访问结果时执行一次。还要记住减少{{result.object}},因为它也会为每个结果命中数据库。
你可以看看load_all(),faceting等。