lucene搜索结果排序问题

这里先说明一下应用场景:
对用户进行lucene搜索,而希望得到的结果排序有要求,具体如下:
现在假如有下面几条数据:
名字 年龄 地址 个人介绍 备注
user1 李四 19 江南大道 路过 与张三是同学
user2 张三 20 江南大道 张三的介绍 abc
user3 王五 42 三三大道 abc 与李四是同事
user4 赵六 33 江南大道 张三峰是牛人呀 赵
上面几个用户信息全部生成索引,现在通过lucene搜索“张三”(在所有的字段中搜索)
会搜索出 user1(备注中出现张三),user2(名字是张三),user4(个人介绍中出现张三),
现在[b]希望结果[/b]是user2,user4,user1这样的排序,也就是说得到的结果要求
名字包含“张三"
个人介绍包含”张三“
备注包含”张三“
而不是随便的从上到下user1,user2,user4
也就是说得到的结果集中希望名字匹配优先,然后是个人介绍,然后是备注,依照这样的顺序进行排序下来,


在这里来问一下各位大侠们,有没有什么好办法 ?


============================
http://www.iteye.com/topic/803195
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene是一个非常强大的全文搜索引擎,提供了许多自定义排序的方式,其中一种是使用FieldComparatorSource。 FieldComparatorSource可以让我们自定义排序规则,它是一个接口,需要我们实现其中的两个方法: 1. newComparator(String fieldname, int numHits, int sortPos, boolean reversed): 这个方法用于创建一个FieldComparator,其中参数fieldname表示排序字段的名称,numHits表示搜索结果的数量,sortPos表示排序的位置,reversed表示是否是降序排序。 2. setScorer(Scorer scorer): 这个方法用于设置排序的评分器,也就是计算分数的方式。 FieldComparatorSource的实现可以参考以下代码: ```java public class CustomFieldComparatorSource extends FieldComparatorSource { private static final long serialVersionUID = 1L; @Override public FieldComparator<Integer> newComparator(String fieldname, int numHits, int sortPos, boolean reversed) throws IOException { return new FieldComparator<Integer>() { private int[] values; private int bottom; @Override public void setScorer(Scorer scorer) throws IOException { // do nothing } @Override public void setBottom(int bottom) { this.bottom = bottom; } @Override public int compare(int slot1, int slot2) { return Integer.compare(values[slot1], values[slot2]); } @Override public int compareBottom(int doc) throws IOException { return Integer.compare(bottom, values[doc]); } @Override public void copy(int slot, int doc) throws IOException { values[slot] = doc; } @Override public FieldComparator<Integer> setNextReader(LeafReaderContext context) throws IOException { values = new int[context.reader().maxDoc()]; return this; } @Override public Integer value(int slot) { return values[slot]; } }; } } ``` 这个实现是一个简单的例子,只是按照整数类型的字段进行排序,可以根据实际需求进行修改。使用这个自定义排序的时候可以这样调用: ```java SortField sortField = new SortField("field_name", new CustomFieldComparatorSource()); Sort sort = new Sort(sortField); ``` 其中field_name是要排序的字段名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值