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进行兴趣点搜索排序的两种思路相关推荐
- C++中sort函数从大到小排序的两种方法
1.sort函数描述 而且,sort函数的算法效率相当于快排,使用sort函数有时候可能比我们自己写一个排序算法,可能效率更高. 2.使用sort函数排序 #include <iostream& ...
- php order by 3-- 没反应,Thinkphp 无法使用-)order() 排序的两种解决办法!
Thinkphp 无法使用-)order() 排序的两种解决办法! 使用ThinkPHP,站群,却发现无法使用->order($order)来排序. $order = " info.d ...
- Word 2003中打开最近操作过的文档的两种推荐的方法
本文介绍Word 2003中打开最近操作过的文档的两种推荐的方法. 注:我的系统为WINDOWS 7,与XP下基本一致. 方法1: 在WINDOWS 7下,点击任务栏上的WINDOWS图标(即&quo ...
- 利用网络信息减少因果推断中的confounding bias--结合两种思路的新方法
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 本期AI TIME PhD专场,我们有幸邀请到了来自亚利桑那州立大学的博士生郭若城,为我们带来他的精彩分享--利用网络信息减少因果推断中 ...
- android 设置字体大小和不同颜色,Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果...
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 android:id="@+id/uppaid_time" android:layout_ ...
- 会员营销体系中,保持企业会员营销持久有效的两种手段
在会员营销体系中,企业最关心的问题是什么呢?可能很多企业都没有去深究这个问题,其实很简单,开展企业会员营销的目的是为了提升用户的粘性,让用户在企业这里更好的留存,只要用户留存下来,那么企业就可以获取到 ...
- 计算机word降序排列怎么做,word中怎么进行排序的两种方法
word文档中表格除了作为我们的编辑和展示功能之外,还可以进行排序功能,十分方便,那么下面就由学习啦小编给大家分享下word中进行排序的技巧,希望能帮助到您. word中进行排序方法一: 步骤一:将光 ...
- html点击空白处关闭,vue中实现点击空白区域关闭弹窗的两种方法
1. 第一种做法 首页在外层容器里面取一个名字为main,即ref="main",当bankSwitch为true的时候,弹窗出现 你好我是弹窗里面的内容部分 所触发的事件如下: ...
- PHP实现对多维数组按照某个键值排序的两种解决方法
实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种: array_multisort()函数对多个数组或多维数组进行排序. //对数组$ho ...
最新文章
- 微软发起Java on Azure调查,呼吁Java社区积极参与
- Attention To, Convert To Capped Collection
- leetcode 241. Different Ways to Add Parentheses | 241. 为运算表达式设计优先级(Java)
- TTSR再次理解,主要是针对Texture Transformer TT的全部过程的一个梳理
- python之穿越火线游戏代码_Python 大作业之五子棋游戏(附代码)
- IBM服务器,SQLEXPRESS 服务问题
- html浮动标签调整位置,HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来...
- Python中的异常处理try、exception、raise
- drf 频率组件 META字典详情
- hnu 暑期实训之蛇形矩阵
- docker build mysql,Docker创建MySQL容器的方法
- 使用Sakura查看字符十六进制编码(附带ASCII编码表)
- 什么是python基础教程-python基础教程之python是什么?概念解析
- [PC]极品飞车2 特别版
- Asp.net教师管理系统
- HDU6438-Buy and Resell(贪心、思维题)
- 如何选取 android 系统上的编译工具链
- 【面试】面试反问环节
- 如何使用FindBugs进行安全扫描
- FCPX插件:Stupid Raisins Title Pop (78个动画标题+2个额外背景)