文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。数据库
目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等一些部门和政府关系较好,须要在兴趣点搜索时优先显示他们。微信
咱们的兴趣点查询是使用的Lucene进行分词查询的,这涉及到咱们要对咱们搜索出来的结果进行一次优先级排序。这里,我和你们一块儿探讨解决此问题的两种方案。学习
在Lucene4.0前,Document能够经过setBoost来设立文档的优先级。流程图为:测试
可是,此方法在Lucene4.0以后不能使用,由于此以后去掉了Document能够直接setBoost的方法。3d
在项目中,数据存放在数据库中,索引是创建在数据库的该兴趣点表上,因而咱们能够改变咱们的思路,即直接对查询所得的数据先进行排序,而后再创建索引。blog
下面咱们具体讲下实施方案。排序
这里,咱们增长了一个ORDERINDEX排序字段。索引
符合邮局关键字段的数据有多个,咱们将北新桥邮局后面的ORDERINDEX修改成1,若是咱们输入邮局,能将北新桥邮局后门首先返回,则表示方法成功。开发
结果展现:文档
咱们首先能够在建立Document时,增长一个field。该field默认值为false。当咱们须要建立的字符串知足优先查询字符串时,则将该field的值改成true.
而后,再建立查询条件时,增长一个创建在field的查询条件,该查询条件为should型,查询值为true,而且设置其对query的影响为低。
流程图为:
在代码中经过setBoost有以下几个缺点:
a.增长了代码开发量
b.在构建索引字典中遍历是否知足优先条件,比较耗时。
鉴于以上缺点,选择直接经过数据源排序构建索引字典是比较好的方式。
因为Lucene中分词的粒度很难控制,好比邮局二字。当咱们输入邮或者邮局时,是能够有查询结果的。可是输入局时却不能。
针对此种问题,基于Lucene的分词条件进行修改和扩展,是能根本解决问题的方法之一,可是学习成本略大。
此处我选择了一种折中的方式来解决,即分词查询后判断查询结果是否为空,若是是空,则触发数据库查询。
固然,触发数据库查询的前提是,兴趣点不能过多。通常项目中兴趣点均在10W之内,因此数据库查询消耗时间是有限的。
而为何不直接使用数据库查询是在于:
a.分词查询能够加速查询效率。
b.分词查询避免数据库查询使用过多的like关键字。
c.分词查询能够创建对拼音检索的支持。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^