WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1.背景
目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等一些部门和政府关系较好,需要在兴趣点搜索时优先显示他们。
我们的兴趣点查询是使用的Lucene进行分词查询的,这涉及到我们要对我们搜索出来的结果进行一次优先级排序。这里,我和大家一起探讨解决此问题的两种方案。
2.字典创立时对字典文档设置优先级
2.1.通过Document的setBoost来建立文档优先级
在Lucene4.0前,Document可以通过setBoost来设立文档的优先级。流程图为:

但是,此方法在Lucene4.0之后不能使用,因为此之后去掉了Document可以直接setBoost的方法。
2.2.通过对数据源进行排序来解决建立字典文档优先级
在项目中,数据存放在数据库中,索引是建立在数据库的该兴趣点表上,于是我们可以改变我们的思路,即直接对查询所得的数据先进行排序,然后再建立索引。
下面我们具体讲下实施方案。
2.2.1.修改兴趣点表,增加排序字段

这里,我们增加了一个ORDERINDEX排序字段。
2.2.2.在代码中对数据源进行排序,然后生成字典

2.2.3.测试例子
符合邮局关键字段的数据有多个,我们将北新桥邮局后面的ORDERINDEX修改为1,如果我们输入邮局,能将北新桥邮局后门首先返回,则表示方法成功。

结果展示:

3. 分词查询时,通过设置query 影响排序
3.1.思路分析
我们首先可以在创建Document时,增加一个field。该field默认值为false。当我们需要创建的字符串满足优先查询字符串时,则将该field的值改为true.
然后,再创建查询条件时,增加一个建立在field的查询条件,该查询条件为should型,查询值为true,并且设置其对query的影响为低。
流程图为:

3.2.具体实现
3.2.1增加类score字段

3.2.2增加query影响条件

4.总结
在代码中通过setBoost有如下几个缺点:
a.增加了代码开发量
b.在构建索引字典中遍历是否满足优先条件,比较耗时。
鉴于以上缺点,选择直接通过数据源排序构建索引字典是比较好的方式。
5.扩展
由于Lucene中分词的粒度很难控制,比如邮局二字。当我们输入邮或者邮局时,是可以有查询结果的。但是输入局时却不能。
针对此种问题,基于Lucene的分词条件进行修改和扩展,是能根本解决问题的方法之一,但是学习成本略大。
此处我选择了一种折中的方式来解决,即分词查询后判断查询结果是否为空,如果是空,则触发数据库查询。
当然,触发数据库查询的前提是,兴趣点不能过多。一般项目中兴趣点均在10W以内,所以数据库查询消耗时间是有限的。
而为什么不直接使用数据库查询是在于:
a.分词查询可以加速查询效率。
b.分词查询避免数据库查询使用过多的like关键字。
c.分词查询可以建立对拼音检索的支持。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路的更多相关文章
- 用Java集合中的Collections.sort方法对list排序的两种方法
用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- vs中发布WebSever时启用HTTP-POST和HTTP-GET这两种协议
一.问题介绍 在vs中建立一个websever项目时候默认是禁用HTTP-POST和HTTP-GET这两种协议的.但是如果你是在本机上去调试或者是在iis中浏览都会有HTTP-POST这种方式,因为这 ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- 【spring data jpa】使用spring data jpa时,关于service层一个方法中进行【删除】和【插入】两种操作在同一个事务内处理
场景: 现在有这么一个情况,就是在service中提供的一个方法是先将符合条件的数据全部删除,然后再将新的条件全部插入数据库中 这个场景需要保证service中执行两步 1.删除 2.插入 这两步自然 ...
- 解决Mysql的主从数据库没有同步的两种方法
今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常.show master status; ...
- 【转】java中byte数组与int类型的转换(两种方式)----不错
原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...
- pat1067 在离散数学中置换群思想上可用并查集和递归两种方法求解问题
1.递归求解 注:叙述时 节点其实就是数字0-N-1 !!!最好用一个数组记录0-N-1每个数字的位置 !!!递归计算一个置换群内部的节点数 分为两种情况 累加M,M即是一个置换群所有数字在正确位置 ...
- springMVC中对HTTP请求form data和request payload两种数据发送块的后台接收方式
最近在做项目中发现,前台提交数据时,如果通过form表单提交和ajax发送json时,springMVC后台接收不能都通过@ModelAttribute方式处理,经过一番查找后,ajax发送json请 ...
随机推荐
- Unity3D UGUI之fbx模型导入问题
在UI层添加了一个fbx的模型,但是在game模式和运行中无法看到这个fbx. Canvas上面有个Render Mode :Screen Space - Overlay.Screen Space ...
- PHP基础知识之常量
定义: define("FOO", "something");
- 如何在Windows7上完全卸载Oracle 11g(转)
http://blog.csdn.net/haishu_zheng/article/details/19180081
- STOMP协议介绍
STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息 ...
- ABP理论学习之OWIN集成
返回总目录 如果你的应用中使用了OWIN,那么需要在主项目(一般来说是指Web项目)中添加Abp.Owin的nuget包,然后像下面那样在OWIN的 Startup文件中调用 UseAbp()扩展方法 ...
- Nodejs之MEAN栈开发(一)---- 路由与控制器
因为工作需要,最近再次学习了node,上一次学习node是2014年,纯粹是个人兴趣,学了入门之后没有运用,加上赶别的项目又不了了之.这次正好捡起来.废话不多说,这里的MEAN指的是Mongodb.E ...
- Redis 主从配置和参数详解
安装redis 下载redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz 解压redis tar -xvf redis-.ta ...
- char varchar nchar nvarcharar到底有多大区别
首先说明下,ASP.NET MVC系列还在龟速翻译中. 工作好多年,基础知识甚是薄弱,决定以后在coding(cv操作)的时候尽量多google下,然后总结下来,目的有三: 1. 加深自己的理 ...
- Visual Studio Code + live-server编辑和浏览HTML网页
第一步: 安装Visual Studio Code + Node.JS 第二步:通过如下命令行安装live-server npm install -g live-server 第三步:打开Visual ...
- AngularJs之一
在讲正题之前,先说一下有关angular简介方面的信息: 1. angularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用 ...