文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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分词查询的设计和实现的更多相关文章

  1. Hibernate Search集与lucene分词查询

    lucene分词查询参考信息:https://blog.csdn.net/dm_vincent/article/details/40707857

  2. MVC中使用Entity Framework 基于方法的查询学习笔记 (一)

    EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...

  3. MVC中使用Entity Framework 基于方法的查询学习笔记 (三)

    紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...

  4. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  5. (十一)WebGIS中要素(Feature)的设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在GIS中元素一般分为点元素,线元素,面元素以及symbol ...

  6. WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等 ...

  7. WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...

  8. 基于lucene的案例开发:查询语句创建PackQuery

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44656141 http://www.llwjy.com/blogdetail/1 ...

  9. C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil

    最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Sp ...

随机推荐

  1. Insert or Merge && Insertion or Heap Sort

    原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...

  2. C语言内存分配

      (1)代码区(text segment).存放CPU执行的机器指令(machine instructions).通常,代码区是可共享的 (即另外的执行程序可以调用它),因为对于频繁被执行的程序,只 ...

  3. 对 griview获取的数据添加方法 6月

    <asp:TemplateField HeaderText="日期">                            <HeaderStyle CssCl ...

  4. 1035-Spell checker(模糊匹配)

    一,题意: 给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束 1,若某个单词能在字典中找到,则输出corret 2,若某个单词能通过 变换 或 删除 或 添加一个字 ...

  5. MVC学习一:EF

    目录 一.EF修改和删除的多种方法 二.标准查询where 三.include 四.skip take 五.反射获取实例属性 六.EF DLL数据访问帮助类 一.EF修改和删除的多种方法 方法1:官方 ...

  6. Nova PhoneGap框架 第五章 文件结构

    一个好的项目架构必然有着合理的文件结构,如果一个项目的文件组织混乱,那么可以断言一定是项目架构有问题. 合理的文件结构能够帮你更清晰的管理你的文件,并且当需要添加新的文件的时候,你的程序员很清楚应该加 ...

  7. 软件工程(QLGY2015)博客点评总结

    目录 第一次作业(2015.5.9) 第二次作业(2015.5.21) 第三次作业(2015.6.11) 2015上半年软工助教总结 第一次作业(2015.5.9) 存在主要问题 1)书写这种练习博客 ...

  8. .NET 新标准介绍

    本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移.文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意味着什么. 如果你对细节感兴趣,这篇文章 ...

  9. HTTPS那些事(一)HTTPS原理(转载)

    原创地址:http://www.guokr.com/post/114121/   楔子 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行 ...

  10. 允许Sublime编辑器在Ubuntu上输入中文

    Sublime Text是一款功能非常强大的轻量级代码编辑器,有关功能介绍和使用可以看我另一篇文章的描述http://www.cnblogs.com/jaxu/p/5037547.html 不过,在U ...