基于Solr的空间搜索(3)
接上文,本文将继续介绍基于Solr的地理位置搜索的第二种实现方案
CartesianTiers+GeoHash
从基于Solr的地理位置搜索(2)文章中可以看到完全基于GeoHash的查询过滤,将完全遍历整个docment文档,从效率上来看并不太合适,所以结合笛卡尔层后,能有效缩减少过滤范围,从性能上能很大程度的提高。
构建索引阶段:
看到这里大家肯定明白了。越相近的经纬度在同层肯定会在同一个网格中,所以他们存储的tierBoxId就会是一样。那么查询的时候通过经纬度对应层的tierBoxId,也就能找到相同层域的docId,但是如果给定的的查询范围大,可能需要将若干层的所属网格的docId都查到。
整个查询过程是先通过笛卡尔层将若干个网格涉及的DocList存入bitSet,如下代码所示:
介绍完笛卡尔层的计算后,接下来介绍笛卡尔层过滤后返还的bitset如何和geoHash结合,从实现上讲其实很简单,就是将通过笛卡尔层过滤的数据结果集合 依次遍历计算其与查询给定的经纬度坐标的球面距离,同时将该计算距离和查询指定范围距离进行比较,如果大于给定距离,则将当前记录继续过滤掉,那么最终剩下的数据结果集合,将是满足查询条件的地理位置结果集合。具体实现流程见如下代码:
再看GeoHashDistanceFilter中最核心的方法getDocIdSet():
从上述分析中大家应该可以想到 采用笛卡尔层 Filter结合GoHash Filter的实现方案,在计算规模上会比单独使用GeoHash少了很多,而在查询性能也会有更优异的表现。
最后附上一个本地Demo的查询实例,用geofilter查找给定经纬度500km内的数据:
q=*:*&fq={!geofilt pt=30.15,-79.85 sfield=tier d=500}
查询返回结果:
建议继续学习:
- 怎样用好Google进行搜索 (阅读:15318)
- 淘宝搜索:定向抓取网页技术漫谈 (阅读:8941)
- 简析搜索引擎中网络爬虫的搜索策略 (阅读:6811)
- 几种常见的基于Lucene的开源搜索解决方案对比 (阅读:5531)
- 基于用户行为分析的搜索引擎自动性能评价 (阅读:5206)
- 用Sphinx快速搭建站内搜索功能 (阅读:5142)
- 百度搜索URL参数解析 (阅读:5165)
- 附近地点搜索初探 (阅读:4786)
- 互联网网站的反爬虫策略浅析 (阅读:4727)
- Xapian搜索体系结构 (阅读:4786)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:hongzhen 来源: 淘宝网综合业务平台团队博客
- 标签: Solr 搜索 空间搜索
- 发布时间:2013-08-15 13:40:09
-
[882] WordPress插件开发 -- 在插件使用 -
[136] 解决 nginx 反向代理网页首尾出现神秘字 -
[57] 整理了一份招PHP高级工程师的面试题 -
[55] 分享一个JQUERY颜色选择插件 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 用 Jquery 模拟 select -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] jQuery性能优化指南 -
[52] CloudSMS:免费匿名的云短信 -
[52] 海量小文件存储

