Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene 优化排序的Solr_Lucene_Solr - Fatal编程技术网

Lucene 优化排序的Solr

Lucene 优化排序的Solr,lucene,solr,Lucene,Solr,我正在使用Solr进行实时搜索索引。我的数据集大约有6000万个大型文档。我需要按时间排序,而不是按相关性排序。目前,我在查询中使用sort标志按时间排序。这对于特定的搜索很有效,但是当搜索返回大量结果时,Solr必须在返回之前获取所有结果文档并按时间进行排序。这很慢,必须有更好的方法 更好的方法是什么?显而易见的第一个问题:你的时间域是什么类型的?如果是字符串,那么排序显然非常慢tdate甚至比date还要快 另外一点:你有足够的内存来存储Solr吗?如果它开始交换,那么性能马上就糟糕了 第三

我正在使用Solr进行实时搜索索引。我的数据集大约有6000万个大型文档。我需要按时间排序,而不是按相关性排序。目前,我在查询中使用sort标志按时间排序。这对于特定的搜索很有效,但是当搜索返回大量结果时,Solr必须在返回之前获取所有结果文档并按时间进行排序。这很慢,必须有更好的方法


更好的方法是什么?

显而易见的第一个问题:你的时间域是什么类型的?如果是字符串,那么排序显然非常慢
tdate
甚至比
date
还要快

另外一点:你有足够的内存来存储Solr吗?如果它开始交换,那么性能马上就糟糕了

第三个:如果你有老Lucene,那么日期只不过是字符串,速度很慢。

警告:粗野的建议,不是基于先前的经验或已知事实。:)

  • 执行不带排序且行数为0的查询以获取匹配数。禁用刻面等以提高性能-我们只需要匹配的总数
  • 根据步骤#1中的匹配数、数据分布和所需结果的计数/偏移量,触发另一个按日期排序的查询,并在日期上添加一个筛选器,如
    fq=date:[NOW()-xDAY TO*]
    其中
    x
    是我们将找到所需数量的匹配文档的估计时间段(以天为单位)
  • 如果步骤#2的结果数量小于您需要的数量,则稍微放松过滤器并触发另一个查询

  • 对于初学者,您可以使用以下公式来估计
    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毫秒,但避免对大型数据集进行排序可能是值得的。我来试试这个。我想一定有更好的办法。是的,我同意这看起来有点古怪。另一种选择(我回答中的警告仍然适用)可能是维护多个索引-一个包含上周的数据,另一个包含上月的数据,另一个包含去年的数据等(根据您的要求和数据/查询分布选择时间段)。当您得到一个新的查询时,在最小的索引上激发它,并检查您是否得到所需数量的结果。如果没有,则依次在更大的索引上激发它,直到获得所需数量的结果。