我们有一个包含86,315,770个文档的solr实例。它使用高达4GB的内存,我们需要它在名为内容的标记化字段上进行分面。磁盘上的索引大小为23GB。
为什么我们要面对一个标记化的字段?因为我们想查询该字段上最常用的“n”个术语。问题是执行此类查询需要花费太长时间。有没有什么方法可以改善这样做的时间?有什么建议吗?
提前致谢。
答案 0 :(得分:2)
由于Solr计算内存数据结构的方面,因此facet计算可能受CPU限制。用于计算构面的代码已经过高度优化(UnInvertedField中的getCounts
方法用于多值字段。)
一个想法是并行化计算。也许最简单的方法是将您的集合拆分为多个分片,如Do multiple Solr shards on a single machine improve performance?中所述。
否则,如果您的术语词典足够小并且查询可以采用有限数量的表单,则可以设置一个不同的系统来维护每个(术语,查询)对的计数矩阵。例如,如果您只允许使用术语查询,则表示您应该维护每对术语的计数。请注意,这将需要大量磁盘空间,具体取决于术语和查询的总数。如果您不要求计数准确,那么最简单的方法可能是在批处理过程中计算这些计数。否则,保持与Solr同步的计数可能(可能,但是)有点棘手。
答案 1 :(得分:0)
您可以使用LukeRequestHandler的topTerms
功能。