文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^
WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现的更多相关文章
-
Hibernate Search集与lucene分词查询
lucene分词查询参考信息:https://blog.csdn.net/dm_vincent/article/details/40707857
-
MVC中使用Entity Framework 基于方法的查询学习笔记 (一)
EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...
-
MVC中使用Entity Framework 基于方法的查询学习笔记 (三)
紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...
-
MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...
-
(十一)WebGIS中要素(Feature)的设计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在GIS中元素一般分为点元素,线元素,面元素以及symbol ...
-
WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等 ...
-
WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
-
基于lucene的案例开发:查询语句创建PackQuery
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44656141 http://www.llwjy.com/blogdetail/1 ...
-
C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil
最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Sp ...
随机推荐
-
clean code meaningful names
---恢复内容开始--- Meaningful Names: use Intention-Revealing Names //nice,Everyone who reads your code (in ...
-
JS之setAttribute和getAttribute
1.ele.getAttribute(attributeName); 返回元素的指定属性值,如果元素没有该属性,则返回null 2.ele.setAttribute(attributeName,val ...
-
ASP.NET MVC- VIEW Overview Part 1
The purpose of this tutorial is to provide you with a brief introduction to ASP.NET MVC views, view ...
-
代码发布架构方案(SVN)
问题: 安装优化软件环境nginx,lvs 程序代码(不断更新) 配置更新(不断变更) 1.SVN介绍 1.1 什么是SVN(Subversion)? SVN(Subversion) ...
-
Java 小型学生管理系统心得
这个学生管理系统相对来说比较简单,主要就是复习下java怎么连接数据库,然后你怎么来实现这个功能,我简单的说下思路吧. 首先你要构思好这个界面,他包括增删查改这些基本功能,然后你去分析这些功能都能怎么 ...
-
[转载]C#播放流媒体的几种方法
做视频开发要学的东西真多,不知道如何入门,乱打乱撞,慢慢摸索吧! 首先搭建Windows Meida Server ,方法很简单,试试就会.在这里需要声明的是,这几种方法 都可以播放 本地视频.并且基 ...
-
记一次诡异的jetty问题
问题出现 用eclipse开发,用jetty跑某个项目时,如果是jsp页面,会出现以下错误. ------------------------------------------------ java ...
-
[Spark性能调优] 第二章:彻底解密Spark的HashShuffle
本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...
-
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
-
Vue.js02:数据绑定v-model用法
<!-- v-model 实现数据的双向绑定 --> <!-- v-model 只能用在表单元素中 --> 示例: <!DOCTYPE html> <!-- ...