文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1.前言
兴趣点查询是指:输入框中输入地名、人名等查询信息后,地图上可以展示出对应信息所在的地址,并且根据需求以不同方式展示出相关地址的属性信息等。
以百度地图为例:
2.原理
所谓兴趣点查询,也就是前台输入描述信息后,后台根据该描述信息在地理数据库中查询到符合查询信息的地理数据和与此对应的属性数据,然后将数据返回给前台,前台进行展示。具体流程图如下:
3.数据采集
所谓巧妇难为无米之炊,地理相关数据的获取是该功能能否成功以及效果是否满足需求的核心。在实际项目中,地理数据的来源一般有以下几种方式:
a.公司自己或外包给其他公司进行兴趣点数据采集。
b.由甲方或者与甲方合作的第三方公司提供数据或者相应数据获取的API接口。此种方式下,为了后期扩展,如果可以将对方数据拉取存入己方设计好的相关表中,为最佳方式。
c.无数据来源,靠网络爬虫进行数据收集。
4.数据入库
当数据准备好后,我们最通常采用的方式就是对数据进行入库管理。
首先,需要根据具体业务需求,对兴趣点表进行符合实际情况的设计。
其次,便是对兴趣点表中数据的注入。常用的有两种方式,一种是将图层数据入库,然后在数据库中写存储过程将该入库数据进行组织后插入到兴趣点表中。第二种便是开发满足需求的小工具,然后利用小工具将图层数据组织后注入到兴趣点表中。
5.传统兴趣点查询的实现
最简单的实现方式,就是在兴趣点表建好后,直接对该表进行sql查询。根据需求,也可以选择使用Like等进行模糊查询。由于实际项目中的兴趣点数据基本不会过十万条,对表的优化没有很明显的要求。
以下是一个最简单的兴趣点表所包含的内容:
查询sql后就可以返回该兴趣点所在坐标和描述信息。
6.基于分词的兴趣点查询的实现
但是,如果用户输入的描述信息过于复杂呢,比如输入的是湖北省武汉大学,而我们数据库中只有武汉大学四个字的描述信息,那么用户将无法查到想要的信息。或者,用户输入的是汉语拼音呢?当然,目前有些数据库,比如Oracle是提供了拼音查汉字的函数,但是首先这不是所有数据库都有的功能,其次,同样存在对复杂拼音无法细分的情况。并且,数据库中LIKE是比较耗资源的,使用过多容易锁表。
那么,是否有更好的解决方案来解决这个问题呢?下面我将跟大家浅谈一下分词技术,和基于支持分词技术的Lucene的简单开发。
6.1中文分词和分词原理
吴军博士在其《数学之美》一书中,对语音识别(马尔科夫链)、信息度量(香农定理及延伸定理)等等搜索方面的知识进行了深入浅出的描述,虽然我不是研究搜索方面的人士,看后也是颇有收获。在此书中,他专门花了一个篇幅来讲解中文分词。此处我便对其中内容大致做一个总结。
6.1.1中文分词的难点
在科学家最开始研究分词技术时,提出的研究方法是利用文法、语义来进行分词。但是这种方法有两个重要的困难,一个是:数据量大,即想通过文法规则覆盖哪怕是20%的真实语句,文法规则的数量至少是几万条;第二个是:即使能够写出涵盖所有自然语言现象的语法规则集合,用计算机解析它也是相当的困难。
后来科学家又提出了统计方法来替代规则方法,即利用马尔科夫链来建立语言统计模型。
马尔科夫链是指:每个状态值取决于前面有限个状态。放在分词上便是,某种分词的方式,只跟其常用的几种分词方式的组合平率有关系。
但是语言统计模型用在中文分词上却又遇到了难题,因为中文并不像英文等每个词语之间有明显的空格分割,并且由于中文的文字意思多变概括力强大等等原因,导致了中文分词比英文分词难度大很多。
6.1.2中文分词方法的发展
6.1.2.1查字典法
把句子 “中国航天官员应邀到美国与太空总署官员开会。” 分成一串词:中国 / 航天 / 官员 / 应邀 / 到 / 美国 / 与 / 太空 / 总署 / 官员 / 开会。
最容易想到的,也是最简单的分词办法就是查字典。这种方法最早是由北京航天航空大学的梁南元教授提出的。
用 “查字典” 法,其实就是我们把一个句子从左向右扫描一遍,遇到字典里有的词就标识出来,遇到复合词(比如 “上海大学”)就找最长的词匹配,遇到不认识的字串就分割成单字词,于是简单的分词就完成了。
但是该方法在复杂语义上效果不好,后来在查字典方法上衍生出了最少词数分词法,不过该方法在语言二意上表现也不尽如人意。
6.1.2.2基于统计语言的符合嵌套法
利用以上提到过的马尔科夫链原理进行统计分词。对于语义定义不明确的词时,在分词时找到符合嵌套的结构。“ 北京大学”四个字,那么先把它当成一个四字词,然后再进一步找出细分词 “北京” 和 “大学”。
6.1.2.3依然存在的问题
在分词的一致性和分词的颗粒度上存在诸多困难。
6.2基于Lucene的兴趣点分词查询的设计和实现
6.2.1Lucene的分词原理
Lucene使用的是倒排文件索引结构,其过程是首先基于分词技术取得数据的关键字,然后基于关键字建立倒排索引。
举个例子,有两篇文章,分别是:
对内容简历索引后,得到的结果是:
6.2.2 设计产生分词索引的数据
这里我们是指对兴趣表的设计。为了让分词中有多个关键字段(field),兴趣点表可以进行更加细化的设计。比如:
6.2.3 分词索引的创建
6.2.3.1 创建ResultSet
6.2.3.2 基于ResultSet建立索引文件
实例化索引器:
建立索引内容:
关闭索引,将索引写入硬盘:
6.2.3.3 基于索引的分词查询
读入索引:
查询关键字段信息的构造:
开始查询:
6.2.3.4拼音查询的构造
当上面的查询没有结果时,开启拼音查询:
6.3弊端
a.创建索引需要的时间比较长。
b.数据库中的数据更新时,并不能自动的触发索引文件的更新。同样索引文件的更新也是花费大量时间。
可以利用Spring提供的scheduling方法来进行定时触发更新:
7.前端展示
前端获得返回的数据后,首先根据XY在地图上标注出查询结果。同时将地理数据对应的属性数据展示在显示面板中。其他具体业务逻辑可以进行定制开发。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^