文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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进行兴趣点搜索排序的两种思路相关推荐

  1. C++中sort函数从大到小排序的两种方法

    1.sort函数描述 而且,sort函数的算法效率相当于快排,使用sort函数有时候可能比我们自己写一个排序算法,可能效率更高. 2.使用sort函数排序 #include <iostream& ...

  2. php order by 3-- 没反应,Thinkphp 无法使用-)order() 排序的两种解决办法!

    Thinkphp 无法使用-)order() 排序的两种解决办法! 使用ThinkPHP,站群,却发现无法使用->order($order)来排序. $order = " info.d ...

  3. Word 2003中打开最近操作过的文档的两种推荐的方法

    本文介绍Word 2003中打开最近操作过的文档的两种推荐的方法. 注:我的系统为WINDOWS 7,与XP下基本一致. 方法1: 在WINDOWS 7下,点击任务栏上的WINDOWS图标(即&quo ...

  4. 利用网络信息减少因果推断中的confounding bias--结合两种思路的新方法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 本期AI TIME PhD专场,我们有幸邀请到了来自亚利桑那州立大学的博士生郭若城,为我们带来他的精彩分享--利用网络信息减少因果推断中 ...

  5. android 设置字体大小和不同颜色,Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果...

    Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 android:id="@+id/uppaid_time" android:layout_ ...

  6. 会员营销体系中,保持企业会员营销持久有效的两种手段

    在会员营销体系中,企业最关心的问题是什么呢?可能很多企业都没有去深究这个问题,其实很简单,开展企业会员营销的目的是为了提升用户的粘性,让用户在企业这里更好的留存,只要用户留存下来,那么企业就可以获取到 ...

  7. 计算机word降序排列怎么做,word中怎么进行排序的两种方法

    word文档中表格除了作为我们的编辑和展示功能之外,还可以进行排序功能,十分方便,那么下面就由学习啦小编给大家分享下word中进行排序的技巧,希望能帮助到您. word中进行排序方法一: 步骤一:将光 ...

  8. html点击空白处关闭,vue中实现点击空白区域关闭弹窗的两种方法

    1. 第一种做法 首页在外层容器里面取一个名字为main,即ref="main",当bankSwitch为true的时候,弹窗出现 你好我是弹窗里面的内容部分 所触发的事件如下: ...

  9. PHP实现对多维数组按照某个键值排序的两种解决方法

    实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种: array_multisort()函数对多个数组或多维数组进行排序. //对数组$ho ...

最新文章

  1. 微软发起Java on Azure调查,呼吁Java社区积极参与
  2. Attention To, Convert To Capped Collection
  3. leetcode 241. Different Ways to Add Parentheses | 241. 为运算表达式设计优先级(Java)
  4. TTSR再次理解,主要是针对Texture Transformer TT的全部过程的一个梳理
  5. python之穿越火线游戏代码_Python 大作业之五子棋游戏(附代码)
  6. IBM服务器,SQLEXPRESS 服务问题
  7. html浮动标签调整位置,HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来...
  8. Python中的异常处理try、exception、raise
  9. drf 频率组件 META字典详情
  10. hnu 暑期实训之蛇形矩阵
  11. docker build mysql,Docker创建MySQL容器的方法
  12. 使用Sakura查看字符十六进制编码(附带ASCII编码表)
  13. 什么是python基础教程-python基础教程之python是什么?概念解析
  14. [PC]极品飞车2 特别版
  15. Asp.net教师管理系统
  16. HDU6438-Buy and Resell(贪心、思维题)
  17. 如何选取 android 系统上的编译工具链
  18. 【面试】面试反问环节
  19. 如何使用FindBugs进行安全扫描
  20. FCPX插件:Stupid Raisins Title Pop (78个动画标题+2个额外背景)

热门文章

  1. 有关Monkey命令的两个隐藏选项
  2. 遍历指定目录下的图片文件 显示在gridview 并添加点击事件
  3. 利用DotRAS组件,实现ADSL的自动拨号断网自动化操作[转]
  4. MIX 2008与ASP.NET MVC框架的Road-Map
  5. C#托管代码调用C++非托管代码
  6. JVM运行时内存分区
  7. android10适配机型华为,EMUI10适配机型进度公布 这10款机型将率先尝鲜
  8. 斐波那契数列的Python实现
  9. 固态电池技术取得新突破,充电一分钟续航800公里
  10. Jquery Mobile 画面导航栏共用的实现方法