使用lucene对搜索结果排序

本文介绍如何在Lucene中实现特定字段的排序功能,包括索引创建时字段类型的配置及搜索时排序逻辑的实现,并探讨了实时更新索引时可能出现的问题。
lucene默认根据匹配度对搜索结果降序排,如果对某个域进行排序?
通常分两步:

step1)建索引时
doc.add(newField("audittime",row.get("audittime").toString(),
Field.Store.NO,Field.Index.UN_TOKENIZED));

关键点是你需要排序的字段建索引时应该采用Field.Index.UN_TOKENIZED,至于需不需要Field.Store.NO看实际情况,反正不影响排序

step2)搜索时
publicHitssearch(SearchVOsearchVO)throwsIOException...{
................

Sortsort
=this.buildSort(searchVO);

Hitshits
=searcher.search(query,sort);

returnhits;
}


privateSortbuildSort(SearchVOsearchVO)...{

if(searchVO.getOrderby()==null||searchVO.getOrderby().length()<1)...{
returnnull;
}


Sortsort
=newSort(searchVO.getOrderby(),
(searchVO.getAscflag()==1?false:true
));

returnsort;

}

关键点是通过建立一个Sort实例然后传给IndexSearcher 的另一个重载方法search(Query query,Sort sort);

通过Sort你可以指定排序字段名,升序降序.

如果你需要特指字段类型,你需要使用 new Sort(SortField field)
或者你需要通过多字段排序,你需要使用 new Sort(SortField[] fields)
我就不再赘述了

题外话:

使用lucene 排序是很简单的,但如何发挥它的效果是一个值得思考的地方.

如果你是实时的更新lucene索引我没话说(这需要相当谨慎的设计).

如果你定时更新索引,就会有些问题,比如你要排序的字段更新速度很快,你应该如何显示它? 因为你排序的数据(即建索引时的数据)和当前的数据并不完全同步,这会给显示带来问题.如果你显示建索引时的数据,这样排序本身没问题,但客户会很奇怪我的数据明明是6了怎么还显示4.如果你显示当前的数据就更奇怪了,客户可能会奇怪我的数据是1000怎么排名第4,排名第一的才500? 如果你的数据更新缓慢,这样做不会有什么问题.但更新很快的话就是灾难了.




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值