2012-03-08 56 views
4

我正在使用SOLR-3.4,具有LatLonType(subType = tdouble)的模式进行空间过滤。我有一个约20M的地方索引。我的基本问题是,如果我使用缓存= true的bbox过滤器,性能相当不错(大约40-50 QPS,大约100-150毫秒的延迟),但是一个很大的缺点是疯狂快速的旧gen堆增长最终导致主要收藏每30-40分钟(在一个非常大的堆上,25GB)。而在这一点上,表现是无法接受的。另一方面,我可以关闭bbox过滤器的缓存,但随后我的延迟和QPS下降(延迟从100ms => 500ms下降)。 NumericRangeQuery javadoc讨论了您可以获得的出色性能(小于100毫秒),但现在我想知道是否启用了filterCache,并且没有人打算查看堆结果的增长。我觉得这是一种捕捉,因为这两种配置都不是真的可以接受的。solr空间不良性能

我愿意接受任何想法。我最后的想法(未尝试)是使用地理散列(并且祈求它或者在cache = false的情况下执行得更好,或者如果cache = true,则可以有更多的可管理的堆增长)。

编辑:

精密步:默认(8双,我认为)

系统内存:32GB(EC2 M2 2XL)

JVM:24GB

指数尺寸:11 GB

EDIT2:

tdouble与precisionStep为8意味着您的双打将被分割为8位序列。如果你所有的纬度和经度只与最后一个8位的序列有所不同,那么tdouble将具有相同的性能,在范围查询中具有正常的双倍。这就是为什么我建议测试precisionStep为4.

问题:这实际上对于双值的含义是什么?

+0

什么precisionStep你用于你的tdouble字段?系统方面,有没有为OS缓存留下一些内存?你能分享你系统的内存总量,给JVM的数量和索引的大小(以字节为单位)吗? – jpountz 2012-03-08 09:55:04

+0

@jpountz:看到更新的问题,只是不知道如何获得索引大小。 – Kevin 2012-03-08 11:44:28

+0

在unix下,运行'du -hs indexDir'。在Windows下,我认为你可以通过右键单击索引目录中的属性来实现。 – jpountz 2012-03-08 13:47:33

回答

1

具有Solr的配置文件,同时响应您的空间查询将有助于了解什么是缓慢的,例如参见hprof

不过,这里有一些关于如何(可能)提高延迟的想法。

首先,您可以尝试测试在减少precisionStep(例如尝试4)时会发生什么情况。如果纬度和经度彼此太接近并且precisionStep太高,Lucene就无法利用具有多个索引值的优势。

您也可以尝试给JVM少一些内存,以便为操作系统缓存提供更多机会来缓存经常访问的索引文件。

然后,如果仍然不够快,您可以尝试扩展替换TrieDoubleField作为子字段的字段类型,该字段类型将使用getRangeQuery方法的a frange query。这会减少磁盘访问的数量,同时以更高的内存使用量为代价来计算范围。 (我从来没有测试过它,它可能会带来可怕的表现。)

+0

嗨,你能解释一下你的意思吗?“如果纬度和经度相互靠得太近,精度步骤太高,Lucene就无法利用多个索引值。”在我的特殊情况下,我创建了一个距离1英里到20英里的边界框(我猜测1英里和5英里是最常见的,但我还没有特别检查)。 – Kevin 2012-03-09 02:57:38

+0

由于我的索引在磁盘上占用了11GB,我应该假设它需要大致相同的操作系统缓存整个事情?磁盘上的索引大小是否存储字段,还是严格索引?我知道我看到的一个建议是将存储的字段减少到文档密钥,然后管理SOLR之外的文档(即只在solr中进行索引)。 – Kevin 2012-03-09 03:00:17

+0

也,你可以评论geohash?它似乎是一个替代实现(即只是更改schema.xml),然后将bbox过滤器查询指向geohash字段。 – Kevin 2012-03-09 03:01:57