先看DSL:
{
"query": {
"bool": {
"must": [
{
"range": {
"createTime": {
"gt": "2019-03-08 16:32:00",
"lt": "2019-08-08 16:32:00"
}
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 2,
"sort": {
"_script": {
"script": "Math.random()",
"type": "number",
"order": "asc"
}
}
}以上代码是:根据创建时间搜索数据,完了再随机去两条数据
每次执行这个操作,取到的数据都不一样,表示成功!
这个只是DSL的查询语句,但是怎么整合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);前两行是构造随机查询 ScriptSortBuilder
其中的boolQueryBuilder是构造的查询条件,可以将"创建时间"字段放里面。主要是以下代码,需要做些检验,此处简化了。
private BoolQueryBuilder getBoolQuery(String createTimeBegin, String createTimeEnd) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.existsQuery("createTime"));
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createTime");
rangeQuery.from(createTimeBegin);
rangeQuery.to(createTimeEnd);
boolQueryBuilder.must(rangeQuery);
return boolQueryBuilder;
}
注:如果结合分页的话不能加sort排序,会和随机排序想冲突;这是一个坑啊,原理是随机排序完会被sort再次修改掉。
正确:
Pageable pageable = PageRequest.of(0, 10);错误:
Pageable pageable = PageRequest.of(0, 10, new Sort(Sort.Direction.DESC, "createTime"));
版权声明:本文为qq_34707991原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。