“天地图·山东”地名地址数据检索与分析技术研究
“天地图·山东”地名地址数据检索与分析技术研究
针对传统的关系型数据库和全文搜索引擎Lucene无法满足海量地名地址数据高效精准分布式检索与分析的问题,本文基于开源分布式搜索引擎Elasticsearch,从数据处理与入库、词库构建与维护、服务实现、结果优化处理等方面进行研究,构建了一套面向Web应用的分布式地名地址检索与分析服务,实现了关键字检索、聚类统计、穿越查询、高速通车里程统计、逆地理编码、区划定位等功能,并将其应用于“天地图山东”平台。测试表明,该服务具有高性能、高并发、高可用特点,能够满足实际工作需要。
0 引 言
地名地址作为地理信息公共服务平台(天地图)框架数据的重要组成部分,是国家基础地理信息的重要数据内容和社会经济发展的重要基础性战略资源,已在国家的社会治理、经济发展、环境保护、抗震减灾以及公众生活等领域得到了广泛应用。基于地名地址数据的地图检索与分析服务,如地名地址搜索、地理编码、周边搜索、目标空间范围内搜索、道路穿越分析等服务的需求日益广泛。地名地址数据具有数据量大、类型结构复杂、空间关系性强、系统变化快等特点,组织和存储是影响其检索效率和质量的关键因素之一。传统的地名地址数据检索方式有两种:基于传统的关系型数据库的结构化检索和关键词模糊检索方式以及基于Lucene的全文检索方式。第一种方式检索方式单一,匹配效率低下,无法满足海量空间数据的快速检索需求,并且传统的关系型数据库空间分析能力较弱,无法完成海量空间数据的复杂空间分析操作,影响用户体验;第二种方式需要在Lucene的基础上进行二次开发才能实现检索功能,且不具备分布式检索功能,自动化程度较低,限制了检索数据的快速更新和横向扩展。因此,国内许多学者对地名地址检索与分析方法和技术进行了研究。杨柳提出了一种基于地理编码的空间数据全文检索方法,并利用Oracle Text结合ArcEngine实现了空间数据的检索。董洁钰等人利用SCWS中文分词算法对检索关键字和地名地址数据集进行分词,在PostgreSQL中建立了gin索引提高检索效率,并通过分级和分类信息来缩小检索范围,从而提高了检索的精度。林清莹利用改进的Lucene对地名地址数据建立索引,并对索引构建过程中的参数进行优化以及采用多域检索策略,较好地实现了地名地址的检索。张哲等人基于Elasticsearch,提出了一种面向Web电子地图开发的分布式地名地址搜索服务架构,实现了地名地址的检索。这些研究没有构建适用于地名地址的分词词库和同义词词库,且不支持分布式检索,检索的精度和效率都有待进一步提高,而且,已有研究大多是针对点状数据,对于线状和面状等具有复杂空间关系的地理实体数据进行检索和空间分析的研究较少。针对以上问题,本文基于分布式搜索引擎Elasticsearch,研究了空间数据检索与分析的流程与技术。
1 分布式搜索引擎 Elasticsearch
Elasticsearch (简称ES)是一个开源的、基于Lucene、分布式多用户能力的全文搜索引擎,可以实现海量数据的快速存储与检索,是企业级应用程序应用最广泛的搜索引擎框架之一。ES可以存储结构化和非结构化数据,支持结构化检索、数据统计分析、地理空间位置查询等功能,GitHub、维基百科等均基于ES实现了相关的检索功能。
本文在深入研究ES的数据组织、分词机制、索引机制等关键技术的基础上,对地理空间数据特点进行了深入分析,从数据处理与入库、词库构建、服务实现、结果优化等方面入手,构建了一套面向Web应用的地名地址数据检索与分析服务,并将其应用于山东省地理信息公共服务平台(天地图·山东)中。
2 总体架构
地名地址数据检索与分析服务逻辑上可以分为数据层、处理层和接口层。如图1所示。
数据层(即地名地址数据)包括两类,一类是与群众生活密切相关的兴趣点(point of interest,POI)实体,如政府单位、学校、银行、医院等,包括52个大类,203个小类,约600万条;另一类是具有一定空间范围的地理实体,主要为线状数据和面状数据,包括道路、小区面、水系、保护区等20类,约200万条。所有数据均采用ArcGIS File GeoDataBase格式进行存储和管理。
处理层包括地名地址数据处理与入库以及地名词库构建与维护。地名地址数据处理是对数据进行属性检查和几何检查,包括属性字段及内容完整性检查、拓扑错误检查等,数据检查完成后,利用研发的入库工具将地名地址数据存储到ES集群中。地名词库构建与维护是构建具有山东地名特色的分词词库、同义词词库、停用词词库等,并根据数据的变化情况,对词库内容进行修订维护。
接口层是基于ES API和GeoTools研发了地名地址检索与分析服务,实现包括关键字检索、聚类分析、周边搜索、穿越查询、高速公路通车里程统计、逆地理编码、区划定位等功能接口。
2.1 技术路线
本研究的详细技术路线如图2所示,主要包括数据处理与入库、地名词库构建与维护以及检索分析服务等部分。
数据处理与入库:对通过外业采集、众包更新、市县融合、部门推送等途径汇聚的地名地址数据进行质量检查,保证数据属性的完整性以及几何拓扑的正确性。质量检查通过以后,将地名地址数据存储到ES集群中,在这个过程中会利用IK分词器以及构建的地名词库对中文地名地址进行分词,并构建倒排索引。
地名词库构建与维护:构建具有山东地名特色的中文分词词库、同义词库以及停用词库,同时根据地名地址的变化情况对地名词库进行更新维护,并在保证数据不变的情况下动态更新索引。
检索与分析服务:包括地名地址检索与分析服务的设计实现以及对检索结果的优化处理。地名地址检索与分析服务基于ES JAVA API和GeoTools实现关键字检索、周边搜索、区划定位等功能;结果优化处理是对基于搜索词以及POI优先级对检索结果进二次过滤,保证返回结果的相关性。
2.2 数据处理与入库
为了保证数据的完整性和检索结果的准确性,必须对数据进行完整性检查,包括属性检查和几何检查。属性检查主要确保唯一编码、行政区划编码、行政区划名称、名称、地址、数据重要程度、类别等字段存在且内容规范;几何检查则处理空间自相交、悬挂线等拓扑错误。数据检查完成后,将空间数据存储到ES集群中,本文ES采用分布式集群部署,共采用5台服务器作为节点,其中1台为主节点,4台为数据节点,索引分片(shard)设置为4片,复制分片为1片,主复分片存储在不同的节点上,实现了分布式存储和容灾备份的作用。
本文基于Java语言,借助于ES API和GDAL空间数据处理库研发了数据入库软件,通过该软件可以修改数据字段名称、类型、内容,设置分词字段和权重,指定入库索引,动态创建ES动态索引映射模板(Mapping)。ES支持两种地理位置表示方式:geo_point字段类型和geo_shape字段类型,前者用于存储经纬度格式表示的点数据,即本文的POI数据;后者用于存储GeoJson格式表示的线状和面状数据,即本文的地理实体数据。为了实现入库效率的最优化,研究中基于批量的方式实现了数据入库,测试了点、线、面3种几何类型数据的存储效率。通过实验发现,在现有的集群环境下,ES存储效率与单次bulk批量存储大小有关且单次存储量为20M左右时存储效率最高,如图3所示。
2.3 地名词库构建与维护
为了智能地实现对词语意义进行解析,保证中文地名检索的准确性,必须建立一个完善的分词词库,利用分词算法将中文词语拆解成多个词库中存在的具有实际意义的词组,存入倒排索引中,再通过ES中的检索匹配算法,获取检索结果。
本文利用IK分词插件对地名地址数据进行分词,但是其自带的中文词库缺失地名信息,不具有山东地名特色。因此,研究中利用语义结构特征构建了具有山东地名特色的分词词库,首先基于语义结构特征对山东省村名进行解析,统计并分析出山东村名的结构组成和语义特点,确定了村名主要由核心成分、修饰成分和村名特征词组成;然后,根据这些特点构建了只保留核心成分的分词词库,例如“大崔家村”和“小崔家村”只保留“崔家”进入分词词库。同时,为了实现常见口语习惯的地名同义词检索,还构建了同义词库,例如“科学技术局”和“科技局”,“纪律检查委员会”和“纪委”。
2.4 地名地址检索与分析服务实现
本文基于ES Java API和GeoTools开源空间数据处理工具库实现了地名地址数据的检索和分析。对于关键词搜索、聚类统计等非空间检索服务,利用ES提供的Aggregation、MatchQuery、MultiMatchQuery、TermQuery、TermsQuery等API实现。对于周边搜索、穿越查询等空间检索服务,则利用ES的空间数据处理和GeoTools的相关API实现,ES针对geo_point类型数据的查询提供了GeoBoundingBoxQuery、GeoDistanceQuery和GeoPolygonQuery三类API,分别对应了矩形框查询、到点的距离查询和指定多边形范围的查询;针对geo_shape类型数据的查询提供了GeoShapeQueryAPI,可以通过指定任意查询范围和intersects/contains/within/disjoin t4种空间关系进行查询。
以关键词检索为例,首先要对请求参数进行解析,获取关键词、地图级别、当前范围、行政区划等参数值,对关键词进行语义分析,缩小其所属类别,然后结合当前范围、分类信息等参数构建检索条件,实现关键词检索,最后对返回结果根据关键词及数据优先级进行二次过滤,并将最终结果进行数据抽稀和压缩,减少网络传输量。
检索与分析服务允许设置关键字、行政区划代码、POI分类代码、空间范围、缓冲距离等参数,以JSON数组的格式返回检索结果详情,包括名称、地址、类型、经纬度等属性信息以及空间字段信息。
2.5 应用效果
本研究构建的检索与分析服务包括关键字检索、聚类统计、周边搜索、道路穿越查询、高速通车里程统计、逆地理编码、行政区划定位等功能接口。关键字检索返回和关键字最相关的信息;聚类统计根据统计类别和当前地图等级返回各行政区划内统计数量;周边搜索根据当前位置、缓冲距离和搜索类别返回缓冲范围内的数据信息;穿越查询返回指定高速公路穿过的区县市信息;高速通车里程统计返回指定行政区划内各条高速公路的通车里程;行政区划定位根据地图级别和地图中心点返回当前地图中心位置的所在的市、县(区)、乡(镇、街道)等信息。
3 服务性能测试
为了检验地名地址数据检索与分析服务的效率,本文利用LoadRunner软件对服务进行了压力测试。测试环境共包括5个ES虚拟机服务节点,其中1台为主节点,其余4台为数据节点,操作系统为Centos7.5,CPU为4核,内存为8G,JDK版本为8.0_40,ES版本为6.5.1。
测试中采用50、100、300、500并发数,测试过程中每隔10s增加5个访问量,递增并发,并发量达到目标值后,持续测试运行1h,各个功能接口平均响应时间见表1。
由表可知,当并发用户数为50时,所有的功能接口的平均响应时间在1s以内;当并发用户数大于300时,关键字检索、聚类统计、精准检索、周边搜索、逆地理编码、区划定位功能接口依然保持着较强的性能,但是穿越查询、高速通车里程统计接口由于包括大量的空间查询与运算,导致性能降低,达到了1s以上,2s以内,但是仍然在可以接受的范围内。
4 结束语
本文针对地名地址数据数据量大、空间关系复杂、类型结构性强等特点,设计了一套基于ES的分布式地名地址检索与分析服务,从数据处理与入库、地名词库构建与维护、接口设计与实现、结果优化处理等方面解决了地名地址高效精准检索与分析的问题。测试表明,该服务具有高性能、高并发、高可用等特点,能够满足“天地图·山东”地名地址检索与分析的需求。
后期,为了进一步提高地名地址检索与分析的精度与效率,可以从中文分词算法优化改进、建立语义相关分析模型以及记录用户搜索行为等方面进行更加深入的研究。