你好,游客 登录 注册 搜索
背景:
阅读新闻

使用Lucene-Spatial实现集成地理位置的全文检索

[日期:2012-02-02] 来源:Linux社区  作者:mydeman [字体: ]
Lucene通过Spatial包提供了对基于地理位置的全文检索的支持,最典型的应用场景就是:“搜索中关村附近1公里内的火锅店,并按远近排序”。使用Lucene-Spatial添加对地理位置的支持,和之前普通文本搜索主要有两点区别:

1. 将坐标信息转化为笛卡尔层,建立索引

[java]
  1.      private void indexLocation(Document document, JSONObject jo)  
  2.         throws Exception {  
  3.   
  4.     double longitude = jo.getDouble("longitude");  
  5.     double latitude = jo.getDouble("latitude");  
  6.   
  7.     document.add(new Field("lat", NumericUtils  
  8.             .doubleToPrefixCoded(latitude), Field.Store.YES,  
  9.             Field.Index.NOT_ANALYZED));  
  10.     document.add(new Field("lng", NumericUtils  
  11.             .doubleToPrefixCoded(longitude), Field.Store.YES,  
  12.             Field.Index.NOT_ANALYZED));  
  13.   
  14.     for (int tier = startTier; tier <= endTier; tier++) {  
  15.         ctp = new CartesianTierPlotter(tier, projector,  
  16.                 CartesianTierPlotter.DEFALT_FIELD_PREFIX);  
  17.         final double boxId = ctp.getTierBoxId(latitude, longitude);  
  18.         document.add(new Field(ctp.getTierFieldName(), NumericUtils  
  19.                 .doubleToPrefixCoded(boxId), Field.Store.YES,  
  20.                 Field.Index.NOT_ANALYZED_NO_NORMS));  
  21.     }  
  22. }  
        2. 搜索时,指定使用DistanceQueryFilter

[java] view plaincopyprint?
  1. DistanceQueryBuilder dq = new DistanceQueryBuilder(latitude,  
  2.                 longitude, miles, "lat""lng",  
  3.                 CartesianTierPlotter.DEFALT_FIELD_PREFIX, true, startTier,  
  4.                 endTier);  
  5. DistanceFieldComparatorSource dsort = new DistanceFieldComparatorSource(  
  6.                 dq.getDistanceFilter());  
  7. Sort sort = new Sort(new SortField("geo_distance", dsort));  
      下面是基于Lucene3.2.0和JUnit4.8.2的完整代码。

[html]
  1. <dependencies>  
  2.     <dependency>  
  3.         <groupId>junit</groupId>  
  4.         <artifactId>junit</artifactId>  
  5.         <version>4.8.2</version>  
  6.         <type>jar</type>  
  7.         <scope>test</scope>  
  8.     </dependency>  
  9.     <dependency>  
  10.         <groupId>org.apache.lucene</groupId>  
  11.         <artifactId>lucene-core</artifactId>  
  12.         <version>3.2.0</version>  
  13.         <type>jar</type>  
  14.         <scope>compile</scope>  
  15.     </dependency>  
  16.     <dependency>  
  17.         <groupId>org.apache.lucene</groupId>  
  18.         <artifactId>lucene-spatial</artifactId>  
  19.         <version>3.2.0</version>  
  20.         <type>jar</type>  
  21.         <scope>compile</scope>  
  22.     </dependency>  
  23.     <dependency>  
  24.         <groupId>org.json</groupId>  
  25.         <artifactId>json</artifactId>  
  26.         <version>20100903</version>  
  27.         <type>jar</type>  
  28.         <scope>compile</scope>  
  29.     </dependency>  
  30. </dependencies>  


        首先准备测试用的数据:

[plain]
  1. {"id":12,"title":"时尚码头美容美发热烫特价","longitude":116.3838183,"latitude":39.9629015}  
  2. {"id":17,"title":"审美个人美容美发套餐","longitude":116.386564,"latitude":39.966102}  
  3. {"id":23,"title":"海底捞吃300送300","longitude":116.38629,"latitude":39.9629573}  
  4. {"id":26,"title":"仅98元!享原价335元李老爹","longitude":116.3846175,"latitude":39.9629125}  
  5. {"id":29,"title":"都美造型烫染美发护理套餐","longitude":116.38629,"latitude":39.9629573}  
  6. {"id":30,"title":"仅售55元!原价80元的老舍茶馆相声下午场","longitude":116.0799914,"latitude":39.9655391}  
  7. {"id":33,"title":"仅售55元!原价80元的新笑声客栈早场","longitude":116.0799914,"latitude":39.9655391}  
  8. {"id":34,"title":"仅售39元(红色礼盒)!原价80元的平谷桃","longitude":116.0799914,"latitude":39.9655391}  
  9. {"id":46,"title":"仅售38元!原价180元地质礼堂白雪公主","longitude":116.0799914,"latitude":39.9655391}  
  10. {"id":49,"title":"仅99元!享原价342.7元自助餐","longitude":116.0799914,"latitude":39.9655391}  
  11. {"id":58,"title":"桑海教育暑期学生报名培训九折优惠券","longitude":116.0799914,"latitude":39.9655391}  
  12. {"id":59,"title":"全国发货:仅29元!贝玲妃超模粉红高光光","longitude":116.0799914,"latitude":39.9655391}  
  13. {"id":65,"title":"海之屿生态水族用品店抵用券","longitude":116.0799914,"latitude":39.9655391}  
  14. {"id":67,"title":"小区东门时尚烫染个人护理美发套餐","longitude":116.3799914,"latitude":39.9655391}  
  15. {"id":74,"title":"《郭德纲相声专辑》CD套装","longitude":116.0799914,"latitude":39.9655391}     
linux
相关资讯       Lucene 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款