一、某些场景可能需要在全部数据或者条件查询中返回随机的几条数据
比如随机返回4条数据
方式一:随机排序
DSL语句
{ "query": { "match_all": {} }, "sort": [ { "_script": { "script": "Math.random()", "type": "number", "order": "asc" } } ] }
Java api
Script script = new Script("Math.random()"); ScriptSortBuilder sortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER); sourceBuilder.sort(sortBuilder);
这种方式在原先数据集合不要求排序的情况下使用,因为随机数排序会打乱之前原有的顺序,如果要求根据某个字段排序之后再随机返回数据,可以用下面这种方式
方式二:随机分页
因为是分页查询,所以需要提前知道索引的总条数,可以单独查一次
java代码随机分页
Query query = queryBuilder.withQuery(searchSourceBuilder.query()) .withSort(sortBuilder) .withPageable(PageRequest.of(0, size)) .build();
在PageRequest.of()传入计算后的页数与条数即可