通过Lucene获取随机结果

史料库首页

问题

  为了让APP上一切资源皆可搜索,最近几乎把所有数据内容都塞进了Lucene索引,相应发生产的时候这部分MySQL表的同步也就给省掉了。然鹅之前偷懒,对于“史料库”首页数据的刷新都是每次发版前通过SQL语句随机选取生成然后同步的,类似:

1
SELECT * FROM xxx ORDER BY RAND() LIMIT 10;

  最近为了省事,决定加个Quartz定时任务来刷新,那么问题就来了,生产上没有完整的数据表,因为都给塞Lucene里了……

  或许因为已经有封装比较好的Elasticsearch跟Slor了,去网上找基于Lucene的随机搜索排序实现要么就是6-7年前的老版本、要么就是基于Slor之类的方案,无奈1U512M的拖拉机实在是拉不动大家伙( ̄▽ ̄)”

解决

  最后啃吧啃吧官方API文档,好歹还是折腾出来了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static Random random = new Random();
...
Sort sort = new Sort(
new SortField(
"",
new FieldComparatorSource() {
@Override
public FieldComparator<?> newComparator(
String fieldname, int numHits, int sortPos,
boolean reversed) {
return new FieldComparator.TermValComparator(
numHits, fieldname, reversed) {
@Override
public int compareValues(BytesRef val1, BytesRef val2) {
return random.nextBoolean()?1:-1;
}
};
}
}));