暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Elasticsearch7.8实现random随机排序查询(Java)

加耀 2020-09-23
2416

  最近碰到一个需求,要求在查询商品数据时,查询出来的数据结果集需要进行随机排序,于是网上查询了大量的博客,找到了几篇比较不错的博客,是使用ES的DSL语句实现的随机排序;


  DSL语句执行如下:

GET myIndex/_search
{
"from": 0,
"size": 20,
"timeout": "10s",
"sort": {
"_script": {
"script": "Math.random()",
"type": "number",
"order": "asc"
}
}
}
复制


  在Kibana中执行上述script语句比较好使,不过晚上没有找到比较完善的将DSL语句整合到Java中的API,有看到一篇博客,里面的Java代码如下:

Script script = new Script("Math.random()");
ScriptSortBuilder scriptSortBuilder = SortBuilders.scriptSort(script,ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(scriptSortBuilder);
复制


  在上述代码中,通过script得到一个随机排序ScriptSortBuilder,不过折腾了好久,一直不知道如何使用这个ScriptSortBuilder;


  在原来的程序中一直是使用的SearchSourceBuilder,现在新创建出来一个ScriptSortBuilder,不知道如何将二者之间建立关联;


  在网友的指点下,对上述代码进行改进后,通过如下方式进行了随机排序的Java实现,代码如下

private void randomSort(SearchSourceBuilder sourceBuilder){
Script script = new Script("Math.random()");
ScriptSortBuilder sortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER);
sourceBuilder.sort(sortBuilder);
}
复制

  通过查看ScriptSortBuilder类,发现ScriptSortBuilder是SortBuilder的子类,所以能够被SearchSourceBuilder所sort()方法添加到;


  由于发现网上关于Java端的随机排序代码少之又少,遂分享出来,共有需要的朋友可以参考~


文章转载自加耀,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论