用于地理空间查询的 EC2 上的 Solr 性能

Posted

技术标签:

【中文标题】用于地理空间查询的 EC2 上的 Solr 性能【英文标题】:Solr performance on EC2 for geospatial queries 【发布时间】:2012-07-24 17:43:42 【问题描述】:

EC2 配置

mlarge machine - 
4 CPU,
7.5G,
EBS volume,
JVM Memory - 6G,
Solr Version tested on both 4.0-ALPHA and 3.6.1

schema.xml

<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="4" positionIncrementGap="0"/>
<field name="id" type="long" indexed="true" stored="true" required="true" />
<field name="location" type="location" indexed="true" stored="true"/>
<field name="location_0_coordinate" type="tdouble" indexed="true" stored="true" />
<field name="location_1_coordinate" type="tdouble" indexed="true" stored="true" />
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>

solrconfig.xml 中没有变化。

编辑:

<query>
  <filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0"/>
  <queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
  <documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0"/>
  <enableLazyFieldLoading>true</enableLazyFieldLoading>
  <queryResultWindowSize>20</queryResultWindowSize>
  <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
  <useColdSearcher>false</useColdSearcher>
  <maxWarmingSearchers>2</maxWarmingSearchers>
</query>

其中加载了 128M 条数据记录。

Java 客户端代码

        ModifiableSolrParams params = new ModifiableSolrParams();
        params.set("wt","csv");
        params.set("df","id");
        params.set("fl", "id,location");
        params.set("q", "*:*");
        params.set("fq", "!geofilt");
        params.set("sfield", "location");
        params.set("d", "0.05");
        params.set("pt",  columns[1] +"," + columns[2]);
        QueryResponse response = solr.query(params);

顶部

Tasks:  71 total,   1 running,  70 sleeping,   0 stopped,   0 zombie
Cpu(s): 38.7%us,  0.0%sy,  0.0%ni, 49.4%id,  0.0%wa,  0.0%hi,  0.0%si, 11.9%st
Mem:   7634740k total,  7570960k used,    63780k free,   150708k buffers
Swap:        0k total,        0k used,        0k free,  3914812k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                         
956 root      20   0 25.7g 4.0g 889m S 100.1 55.2 353:48.70 java

所以结果是,查询一个文档平均需要大约 1.5 秒。

record 203 response Time 1108 result: 42.7461000,-73.6924000, 
record 207 response Time 1123 result: 40.8448850,-73.7156030, 
record 210 response Time 1180 result: 40.8087660,-74.1583510, 
record 211 response Time 1656 result: 0, 
record 212 response Time 1423 result: 0, 
record 213 response Time 1316 result: 39.1027710,-76.7964910.

有什么建议吗?

【问题讨论】:

【参考方案1】:

试试SOLR-2155,这是一个适用于 Solr 3.x 的插入式地理空间插件

底层算法/方法是 Lucene/Solr 4 中新空间模块的核心。人们告诉我他们使用 SOLR-2155,因为它的性能优于 LatLonType。

在您试用 SOLR-2155 并告诉我们在相同情况下它有多快之后,我建议将您的索引分成 2-3 个分片并进行分布式搜索。

【讨论】:

当然,我会试一试。但是我使用 Solr 4.0.0-ALPHA 得到了类似的性能结果。 Solr 4.0.0-ALPHA尚未使用新的 Lucene 空间模块,但它会。 LatLonType 将保持原样,这将带来新的字段类型。 太棒了!!我放弃了 SOLR-2155 插件,性能有了很大提高。人们是对的!记录2225响应时间79结果:[36.23622997663915]记录2226响应时间174结果:[41.825548047199845]记录2227响应时间62结果:[41.99102492071688,-88.30942897126079]记录2230响应时间142结果:[40.662010135129094, - 73.88779459521174] 我是否应该在 solrconfig.xml 文件中进行任何内存设置更改以进一步提高性能。非常感谢。 我很高兴看到它对您如此有效。很难解释您的回复,但您似乎得到了 62-142 毫秒?排序是一个记忆猪,所以如果可以的话,请避免它。否则,此插件不会显式使用任何内存。为了获得最佳性能,请使用满足您需求的 geohash 长度,而不再使用。长度 10 相当于亚米精度,也许你可以使用更低的精度?有关 geohash,请参阅 Wikipedia 中的表格。将索引优化到更少的段也将有助于提高性能。 我玩弄了 128M 记录的配置:Precision Length = 10,JVM 6G,响应大约 60 -150ms;长度=10,JVM=4G,响应时间10-30ms;长度 = 10,JVM = 2G,响应时间 10 - 30ms。有关配置的任何其他建议,因此我可以进一步减少响应时间。您还可以为我提供有效分片 solr 服务器的链接吗?再次感谢【参考方案2】:

是的,对于初学者来说:如果 No Changes for solrconfig.xml. 你的意思是你正在使用 \example 中的那个而不做任何更改,那么你有一堆你可能没有的东西'不需要(因为它是一个示例,显示了许多不同的功能),所以从那里删除你不需要的东西(我认为主要是字段)并再次测试。

【讨论】:

是的,solrconfig.xml 来自 \example 文件夹。好吧,我看过了,但是除了在查询标签下之外,大部分内容都被注释了。

以上是关于用于地理空间查询的 EC2 上的 Solr 性能的主要内容,如果未能解决你的问题,请参考以下文章

Solr权威指南 下卷

Solr 7 - 如何使用地理空间搜索进行全文搜索

Solr - 如何按地理空间距离排序并返回距离?

RethinkDB - 优化执行地理定位、然后加入、然后分组的查询

用于地理定位/地理空间测试的有效地址列表/数据库

地理空间索引的划分查询