Lucene 优化排序的Solr
我正在使用Solr进行实时搜索索引。我的数据集大约有6000万个大型文档。我需要按时间排序,而不是按相关性排序。目前,我在查询中使用sort标志按时间排序。这对于特定的搜索很有效,但是当搜索返回大量结果时,Solr必须在返回之前获取所有结果文档并按时间进行排序。这很慢,必须有更好的方法Lucene 优化排序的Solr,lucene,solr,Lucene,Solr,我正在使用Solr进行实时搜索索引。我的数据集大约有6000万个大型文档。我需要按时间排序,而不是按相关性排序。目前,我在查询中使用sort标志按时间排序。这对于特定的搜索很有效,但是当搜索返回大量结果时,Solr必须在返回之前获取所有结果文档并按时间进行排序。这很慢,必须有更好的方法 更好的方法是什么?显而易见的第一个问题:你的时间域是什么类型的?如果是字符串,那么排序显然非常慢tdate甚至比date还要快 另外一点:你有足够的内存来存储Solr吗?如果它开始交换,那么性能马上就糟糕了 第三
更好的方法是什么?显而易见的第一个问题:你的时间域是什么类型的?如果是字符串,那么排序显然非常慢
tdate
甚至比date
还要快
另外一点:你有足够的内存来存储Solr吗?如果它开始交换,那么性能马上就糟糕了
第三个:如果你有老Lucene,那么日期只不过是字符串,速度很慢。警告:粗野的建议,不是基于先前的经验或已知事实。:)
fq=date:[NOW()-xDAY TO*]
其中x
是我们将找到所需数量的匹配文档的估计时间段(以天为单位)对于初学者,您可以使用以下公式来估计
x
:
如果您每天将n
文档统一添加到大小n
文档的索引中,并且在步骤1中匹配了一个特定的查询d
文档,那么要获得顶部r
结果,您可以使用x=(n*r*1.2)/(d*n)
。如果在步骤#3中必须经常放松过滤器,则根据需要缓慢增加公式中的值1.2。我找到了答案
如果要按时间而不是相关性排序,请对所有筛选器使用fq=而不是q=。这样,Solr就不会浪费时间计算与q=匹配的文档的加权值。结果证明Solr花了太多时间加权,而不是排序
此外,您还可以通过在solrconfig.xml中的newSearcher和firstSearcher事件侦听器中预热排序字段来加快排序速度。这将确保通过缓存完成排序。我已经在一个专用的盒子上分配了30GB的RAM。也就是说,当Solr尝试按日期排序时,“显示所有项目,每页1100行”的查询将交换(我假设),因为我的索引大约为120GB。我想这是我问题的根源。我使用的是最新的Solr1.4.1,我认为它是最新的Lucene附带的。我用的是日期。也许tdate会加快速度?Solr 1.4.1将tdate用于日期字段,但精度为0。我把它提高到了4的精度(推荐的默认值),但是我没有看到速度的提高。我认为问题在于在运行大型数据集时交换数据。这实际上可能会起作用。执行两次搜索的代价可能会使请求增加大约200毫秒,但避免对大型数据集进行排序可能是值得的。我来试试这个。我想一定有更好的办法。是的,我同意这看起来有点古怪。另一种选择(我回答中的警告仍然适用)可能是维护多个索引-一个包含上周的数据,另一个包含上月的数据,另一个包含去年的数据等(根据您的要求和数据/查询分布选择时间段)。当您得到一个新的查询时,在最小的索引上激发它,并检查您是否得到所需数量的结果。如果没有,则依次在更大的索引上激发它,直到获得所需数量的结果。