http://ju.outofmemory.cn/entry/711
本文将继续介绍基于Solr的地理位置搜索的第二种实现方案
CartesianTiers+GeoHash
从基于Solr的地理位置搜索(2)文章中可以看到完全基于GeoHash的查询过滤,将完全遍历整个docment文档,从效率上来看并不太合适,所以结合笛卡尔层后,能有效缩减少过滤范围,从性能上能很大程度的提高。
构建索引阶段:
String geoHash = GeoHashUtils.encode(latitude, longitude);
docment.addField(“geohash”, geoHash);
//Cartesian Tiers
int tier = START_TIER;//开始构建索引的层数
//Create a bunch of tiers, each deeper level has more precision
//将一条记录的经纬度对应全部笛卡尔层的tierBoxId作为域值构建索引
for (CartesianTierPlotter plotter : plotters) {
docment.addField(“tier_” + tier , plotter.getTierBoxId(latitude, longitude));
tier++;
}
看到这里大家肯定明白了。越相近的经纬度在同层肯定会在同一个网格中,所以他们存储的tierBoxId就会是一样。那么查询的时候通过经纬度对应 层的tierBoxId,也就能找到相同层域的docId,但是如果给定的的查询范围大,可能需要将若干层的所属网格的docId都查到。
整个查询过程是先通过笛卡尔层将若干个网格涉及的DocList存入bitSet,如下代码所示:
public DocIdSet getDocIdSet(final IndexReader reader) throws IOException {
final FixedBitSet bits = new FixedBitSet(reader.maxDoc());
final TermDocs termDocs = reader.termDocs();
//需要查询的若干层网格的boxIdList,当然至此已经过滤掉不需要查询层的boxIdList
final List<Double> area = shape.getArea();
int sz = area.size();
final Term term = new Term(fieldName);//
// iterate through each boxid
for (int i =0; i< sz; i++) {
double boxId = area.get(i).doubleValue();
termDocs.seek(term.createTerm(NumericUtils.doubleToPrefixCoded(boxId)));
// iterate through all documents
// which have this boxId
//遍历所有包含给定boxId的docList,并将其放入bitset
while (termDocs.next()) {
bits.set(termDocs.doc());
}
}
return bits;
}
介绍完笛卡尔层的计算后,接下来介绍笛卡尔层过滤后返还的bitset如何和geoHash结合,从实现上讲其实很简单,就是将通过笛卡尔层过滤的 数据结果集合 依次遍历计算其与查询给定的经纬度坐标的球面距离,同时将该计算距离和查询指定范围距离进行比较,如果大于给定距离,则将当前记录继续过滤掉,那么最终剩 下的数据结果集合,将是满足查询条件的地理位置结果集合。具体实现流程见如下代码:
//将笛卡尔层的Filter作为Geohash的Filter参数传递进去,形成一个过滤链
filter = distanceFilter = new GeoHashDistanceFilter(cartesianFilter, lat, lng, miles, geoHashFieldPrefix);
再看GeoHashDistanceFilter中最核心的方法getDocIdSet():
public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
//在这里使用到了Lucene的FieldCache来作为缓存,实际上缓存了一个以docId为下标,base32编码为值的数组
final String[] geoHashValues = FieldCache.DEFAULT.getStrings(reader, geoHashField);
final int docBase = nextDocBase;
nextDocBase += reader.maxDoc();
return new FilteredDocIdSet(startingFilter.getDocIdSet(reader)) {
@Override
public boolean match(int doc) {
//通过笛卡尔层的过滤后的doc直接找到对应的base32编码
String geoHash = geoHashValues[doc];
//通过解码将base32还原成经纬度坐标
double[] coords = GeoHashUtils.decode(geoHash);
double x = coords[0];
double y = coords[1];
Double cachedDistance = distanceLookupCache.get(geoHash);
double d;
if (cachedDistance != null) {
d = cachedDistance.doubleValue();
} else {
//计算2个经纬度坐标的距离
d = DistanceUtils.getDistanceMi(lat, lng, x, y);
distanceLookupCache.put(geoHash, d);
}
//小于给定查询距离的的docid放入缓存,以供下次使用,同时返回True代表当前docId是满足条件的记录
if (d < distance){
distances.put(doc+docBase, d);
return true;
} else {
return false;
}
}
};
相关推荐
基于solr-geo空间搜索 1、Solr的schema.xml配置 定义坐标field 2、Solr的data-config.xml配置 建立索引 3、java查询语法 坐标距离、分页、排序
本文的研究针对这一问题,通过设计并实现了一个基于Solr的分布式全文检索系统,有效解决了传统系统在处理大规模数据时的瓶颈问题。 系统采用网络爬虫技术,负责从互联网上抓取网页信息。这些信息被保存为文本文件,...
3. **ArcEngine开发的数据库管理系统**:基于ArcEngine,开发了一个数据库管理系统,ArcEngine是一款强大的GIS开发平台,能帮助构建地理信息系统应用。这个系统验证了数据库设计的可行性,并通过实际功能应用实验,...
10. **地理空间搜索**:Solr支持地理空间搜索,可以基于地理位置进行范围查询和距离排序。 11. **XML/JSON API**:Solr 提供了基于HTTP的XML和JSON接口,方便与其他应用程序集成。 12. **强大的文档处理**:Solr...
ikanalyzer-solr中文分词包是专门为Apache Solr设计的一款强大的中文分词工具,它在处理中文文本时能够有效地进行词语切分,提高搜索准确性和效率。标题中提到的"ikanalyzer-solr中文分词包兼容solr7.5"意味着这个...
5. **contrib**: 这里包含了各种社区贡献的模块,提供了额外的功能,如CSV导入、数据驱动的文档更新、地理空间搜索等。 6. **docs**: 包含Solr的API参考文档和其他技术文档,对于开发者和管理员来说非常有用。 7. ...
Solr是Apache软件基金会的一个开源项目,它是基于Java的全文搜索服务器,主要功能包括文档索引、搜索、排序和分布式处理。Solr利用了Lucene库的强大搜索功能,并且提供了更高级别的API和服务,使得企业级搜索应用的...
### 高效的企业级搜索引擎Solr #### 一、Solr概述 Solr是一款高性能、可伸缩的企业级搜索引擎,广泛应用于需要复杂全文检索功能的系统中。它基于Java开发,能够提供高度灵活的配置机制,并且具备强大的索引与查询...
6. **数据分析**:Solr内建了丰富的数据分析组件,如Faceting(分面导航)用于分类和统计,Highlighting(高亮显示)用于查询结果的突出显示,以及Spatial Search(空间搜索)支持地理位置的搜索。 7. **优化与性能...
3. **分布式搜索**:SOLR云(SolrCloud)提供了分布式部署和自动复制,以实现高可用性和水平扩展。 4. **实时搜索**:SOLR的实时索引功能允许在不重启服务的情况下更新索引,提高用户体验。 5. **优化索引**:定期...
Solr能够处理大量数据,并支持多种类型的搜索,如全文检索、空间搜索、拼写检查和 faceted search(分面搜索)。Solrj就是用来与Solr服务器通信的工具,允许开发者通过Java代码来利用Solr的各种功能。 【LDAP】 ...
空间搜索是Solr中针对地理空间信息提供的专门搜索功能。它支持对空间数据进行索引,并提供基于圆形、方形或其他形状的范围搜索,甚至可以根据距离进行搜索结果排序。 检索运算符是Solr中用于构建复杂查询的工具,...
手册的最后一部分往往还包含了一些高级主题,例如与Hadoop集成、地理空间搜索、以及与NoSQL数据库的集成等,这些主题可以吸引已经熟悉Solr基本操作的用户进一步深入探索。 值得注意的是,本手册是基于Apache软件...
Solr是一个开源的搜索引擎,基于Apache Lucene构建,用于快速搜索索引,它支持全文搜索、范围搜索、模糊搜索、高亮显示、动态集群、复制、负载均衡等特性。Solr通常用于网站搜索引擎,它能够索引各种格式的数据,...
- **Solr**:Apache Solr 是一个高性能、基于 Lucene 的全功能搜索引擎平台。它支持分布式搜索,并提供了丰富的功能集来满足企业级搜索需求。 - **版本说明**:本手册针对的是 Solr 3.* 版本,该版本在当时是较为...
5. **地理位置搜索**:内置对地理空间数据的支持,可以基于地理位置进行搜索和排序。 6. **XML/JSON等多格式支持**:Solr支持多种数据交换格式,如XML、JSON和CSV,便于与各种应用程序集成。 7. **自定义插件**:...
- **索引技术**:Solr 基于索引查询数据,这虽然提高了搜索效率,但也可能会占用较多内存空间。 - **高亮显示**:能够突出显示搜索结果中的关键词。 - **分布式搜索**:支持分布式部署,从而实现更高的可扩展性和...
相对而言,Solr是一个功能强大的搜索平台,它同样基于Apache Lucene。Solr的特色是具有成熟的用户界面和多种管理工具,这些工具使得配置和部署都比较容易。Solr对于搜索结果排序提供了强大的功能,也支持复杂的查询...
5. **地理空间搜索**:Solr支持基于地理位置的数据检索,适用于地图应用、位置服务等领域。 6. **丰富的API接口**:Solr提供了多种编程语言的API,方便开发者集成到不同的应用系统中。 7. **分布式部署**:Solr可以...