前言
Elasticsearch 查询默认按照分值由大到小进行排序。
分值计算基于 BM25 算法。
影响排序的方式
可以使用 boost 对字段加权,从而影响排序结果。
GET kibana_sample_data_logs/_search
{
"track_total_hits": true,
"query": {
"bool": {
"should": [
{
"match": {
"message": {
"query": "elasticsearch",
"boost": 2
}
}
},
{
"match": {
"message": {
"query": "beats",
"boost": 1
}
}
}
]
}
}
}
可以使用 script_score 查询指定分值,从而影响排序结果
GET kibana_sample_data_logs/_search
{
"track_total_hits": true,
"query": {
"script_score": {
"query": {
"match": {
"message": "elasticsearch"
}
},
"script": {
"source": """
_score * 2
"""
}
}
}
}
sort排序
对指定字段进行排序,对应的 doc_values
参数需要设置为 true。而 doc_values
参数在创建索引时,默认为 true,即启用。如果字段不需要排序,可以设置为 false。值得注意的是,text 类型的字段对应的 doc_values
参数默认为 false。
PUT kibana_sample_data_logs_values
{
"mappings": {
"properties": {
"bytes": {
"type": "integer",
"doc_values": false
}
}
}
}
POST _reindex
{
"source": {
"index": "kibana_sample_data_logs"
},
"dest": {
"index": "kibana_sample_data_logs_values"
}
}
GET kibana_sample_data_logs_values/_search
{
"track_total_hits": true,
"query": {
"bool": {
"should": [
{
"match": {
"message": {
"query": "elasticsearch"
}
}
}
]
}
},
"sort": [
{
"bytes": {
"order": "desc"
}
}
]
}
上述查询会抛出异常。
sort
支持多字段排序。先按照第一个字段排序,然后按照下一个字段排序。
GET kibana_sample_data_logs/_search
{
"track_total_hits": true,
"sort": [
{
"timestamp": {
"order": "desc"
}
},
{
"response.keyword": {
"order": "desc"
}
},
{
"bytes": {
"order": "desc"
}
},
"_score"
]
}
-
track_scores
:指定是否追踪评分。默认 false,即在使用 sort 排序时,默认不计算评分。 -
order