为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 (_score)由一个浮点数进行表示,并在搜索结果中通过 _score
参数返回, 默认排序是 _score
降序。注: filter不参与评分.
只有字段排序会使评分机制取消.
GET /_search
{
"query" : {
"bool" : {
"filter" : { "term" : { "user_id" : 1 }}
}
},
"sort": { "date": { "order": "desc" }}
}
搜索结果如下:
"hits" : {
"total" : 6,
"max_score" : null,
"hits" : [ {
"_index" : "us",
"_type" : "tweet",
"_id" : "14",
"_score" : null,
"_source" : {
"date": "2014-09-24",
...
},
"sort" : [ 1411516800000 ]
},
...
}
可以主要到的是_score为null了,代表评分机制取消, 结果只按照时间排序
如果我们还是希望通过字段排序的同时, 也引入评分机制
例: 假定我们想要结合使用 date
和 _score
进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序:
GET /_search
{
"query" : {
"bool" : {
"must": { "match": { "tweet": "manage text search" }},
"filter" : { "term" : { "user_id" : 2 }}
}
},
"sort": [
{ "date": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}
Java代码如下:
// 排序条件
FieldSortBuilder ageSortBuilder = SortBuilders.fieldSort("date").order(SortOrder.ASC);
// 默认score是倒序
ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder();
//组装条件
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(defaultQueryBuilder)
.withHighlightBuilder(highlightBuilder)
.withPageable(pageRequest)
.withSort(ageSortBuilder)
.withSort(scoreSortBuilder)
.build();
排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个 sort
值完全相同时才会按照第二个条件进行排序,以此类推。
多级排序并不一定包含 _score
。你可以根据一些不同的字段进行排序,如地理距离或是脚本计算的特定值。
如果是这个字段是集合类型例如 List
对于数字或日期,你可以将多值字段减为单值,这可以通过使用 min
、 max
、 avg
或是 sum
排序模式 。 例如你可以按照每个 date
字段中的最早日期进行排序,通过以下方法:
"sort": {
"dates": {
"order": "asc",
"mode": "min"
}
}
Java代码如下:
FieldSortBuilder dateSortBuilder = SortBuilders
.fieldSort("dates")
.order(SortOrder.ASC)
.sortMode(SortMode.MIN);