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请 ...
随机推荐
- Shell下突破安全狗远程桌面守护
首先在Shell下把安全狗的安装配置给下来 默认安装路径: C:\Program Files\SafedogServer\SafeDogGuardCenter 找到 ProGuardData.ini ...
- java并发编程(十三)经典问题生产者消费者问题
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据&q ...
- js 模版加载到前端
js 模版加载到前端 简单有效不高端 配个路由 /js/:filename , 用 readTemplate 响应请求,前端可以按模块方式直接 require 模板 'use strict' var ...
- 下载判断Android和iOS
//下载 function down(){ var url = ''; var u = navigator.userAgent, app = navigator.appVersion; var isA ...
- Ubuntu添加开机自动启动程序方法
1. 开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置 文件继续引导过程,启动其它进程.通常情况下,修改放置在 / ...
- Linux堆溢出漏洞利用之unlink
Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...
- Google分布式构建软件之一:获取源代码
本文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但尊重作者版权,注名原文地址. 在Google,所有的产品都是在主干上开发的.这样的好处:每个人都可以查看和修改代码, ...
- JavaScript面试时候的坑洼沟洄——数据类型
前些日子写了篇关于最近找工作的一些感受的博客 找工作的一些感悟--前端小菜的成长,没想到得到了很多园友的共鸣,得到了很多鼓励,也有园友希望我分享一些笔试.面试的经验.我觉得分享一些笔试题没太多价值,对 ...
- Worktile协同特色之二:任务看板管理
什么是看板 看板是一种使用可视化管理的方式,跟踪任务在整个价值流中流经的不同阶段,通常我们会用带贴纸的白板,或是电子卡片墙.具备如下几个特征:1. 流程可视化 把工作拆分成小块,一张卡片写一件任务,再 ...
- 文件上传之Apache commons fileupload使用
后台servlet代码: File file1 = null,file2=null; String description1 = null,description2 = ...