{
"query": {
"match": {
"title": "信息"
}
},
"sort": {
"_script": {
"type": "number",
"script": {
"source": "_score + doc['date'].value.toInstant().toEpochMilli() / 100000000000.0",
"lang": "painless"
},
"order": "desc"
}
}
}
解释说明:
"_script"
:指定使用脚本字段进行排序。"type": "number"
:指定脚本返回的类型为数字。"script"
:定义脚本内容,这里的脚本将得分和日期结合起来。"_score"
是文档的搜索得分,"doc['date'].value"
获取文档中的日期字段值。"order": "desc"
:按照脚本计算的值降序排列。
脚本详细说明:
"_score"
是Elasticsearch为每个文档计算的搜索得分。"doc['date'].value.toInstant().toEpochMilli()"
将日期字段转换为毫秒时间戳,这样可以将日期转换为一个数值,便于排序。/ 100000000000.0
是为了确保日期的权重不会太大,使得得分和日期在排序时能够合理地影响排序顺序。
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.sort.ScriptSortBuilder;
import java.io.IOException;
public class ElasticsearchSortingExample {
public void searchAndSort(RestHighLevelClient client) throws IOException {
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 设置查询
sourceBuilder.query(QueryBuilders.matchQuery("title", "信息"));
// 设置排序
ScriptSortBuilder scriptSortBuilder = new ScriptSortBuilder(
"_score + doc['date'].value.toInstant().toEpochMilli() / 100000000000.0",
"number")
.order(SortOrder.DESC);
sourceBuilder.sort(scriptSortBuilder);
searchRequest.source(sourceBuilder);
// 执行搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理搜索结果
// 可以在这里处理搜索结果,如遍历获取每个文档的内容等
}
}