【发布时间】:2019-07-13 21:56:55
【问题描述】:
我想使用休眠搜索弹性搜索库实现某种“随机”排序。我正在做的事情如下:
实现 FieldComparator:
public class RandomOrderFieldComparator extends FieldComparator<Integer> {
private final Random randomGenerator = new Random();
@Override
public int compare(int slot1, int slot2) {
return randomGenerator.nextInt();
}
@Override
public void setTopValue(Integer value) {
//not needed as the purpose is to generate random integers w
}
@Override
public Integer value(int slot) {
return randomGenerator.nextInt();
}
@Override
public LeafFieldComparator getLeafComparator(LeafReaderContext context) throws IOException {
return null;
}
}
实现 FieldComparatorSource
public class SampleFieldComparatorSource extends FieldComparatorSource {
@Override
public FieldComparator<?> newComparator(String fieldname, int numHits, int sortPos, boolean reversed) throws IOException {
return new RandomOrderFieldComparator();
}
}
最后创建一个提供 FieldComparatorSource 的自定义 SortField:
queryBuilder
.sort()
.byNative(
new SortField(
"id",
new SampleFieldComparatorSource()
)
);
问题是它仍然只使用“id”字段上的正常排序生成查询,并且比较器永远不会命中:
"sort": [
{
"id": {
"order": "asc"
}
}
]
我做错了什么,使用休眠搜索库实现“随机”排序的最佳方法是什么?
【问题讨论】:
-
离题:生成随机数进行比较是个坏主意。该算法可能依赖于一些比较属性,包括相同值的恒定结果和传递性,当它们不满足时,可能会发生任意坏事。 IIRC,C++ 在这种情况下崩溃。
标签: java elasticsearch hibernate-search