ElasticSearch排序

ElasticSearch查询结果默认按相关性(_score)倒序排序。可指定字段值进行排序,例如时间,排序结果会包含'sort'字段。同时支持多重排序,能通过多个字段实现复合排序策略。字符串参数也能直接指定排序方式。

ElasticSearch相关性排序

在Es进行查询的时候,查询结果会按相似程度进行排序,相关性越高则排名越靠前。
以_score字段体现相似程度大小

排序方式

默认情况下是按倒序排序

字段值排序

指定按某个指端进行排序,例如按照时间排序

GET /_search
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "user_id": 1
                }
            }
        }
    },
    "sort": {
        "date": {
            "order": "desc"
        }
    }
}

查询后会在结果中增加一个sort字段,其值用于排序。
如下:

    "hits" : {
    "total" : 6,
        "max_score" : null, 
        "hits" : [ {
        "_index" : "us",
        "_type" : "tweet",
        "_id" : "14",
        "_score" : null, 
        "_source" : {
        "date": "2014-09-24",
...
},
        "sort" : [ 1411516800000 ] 
},
...
}

多重排序

如果想使用多个字段进行多重排序,可以在sort里面多加字段。

GET /_search
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "user_id": 2
                }
            },
            "query": {
                "match": {
                    "tweet": "manage text search"
                }
            }
        }
    },
    "sort": [
        {
            "date": {
                "order": "desc"
            }
        },
        {
            "_score": {
                "order": "desc"
            }
        }
    ]
}

字符串参数排序

没有使用结构体查询的时候也可以指定排序

GET /_search?sort=date:desc&sort=_score&q=search
### Elasticsearch 排序功能详解 #### Java API 实现排序操作 为了在 Elasticsearch 中执行排序操作,可以利用 `SortBuilder` 类来构建排序条件。下面是一个完整的例子展示如何通过 Java 客户端连接到 Elasticsearch 并对文档按照特定字段进行升序或降序排列。 ```java // 导入必要的包 import org.elasticsearch.action.search.SearchRequest; 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.SortOrder; public class EsSortExample { private static RestHighLevelClient client = new RestHighLevelClient(/* 配置 */); public void sortDocuments() throws Exception { SearchRequest searchRequest = new SearchRequest("index_name"); // 构建查询请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); // 添加排序规则, 对 "age" 字段按降序排序 sourceBuilder.sort("age", SortOrder.DESC); searchRequest.source(sourceBuilder); // 执行搜索并处理响应... var response = client.search(searchRequest, RequestOptions.DEFAULT); // 处理返回的结果集 } } ``` 此代码片段展示了如何创建一个简单的匹配所有文档(`match_all`) 的查询,并指定基于 `"age"` 字段的降序排序[^1]。 对于更复杂的场景比如地理位置的距离排序,则可以通过 Geo Distance Query 来完成: ```json GET /_search { "query": { "bool": { "must": [ { "match_all": {} } ], "filter": [ { "geo_distance": { "distance": "200km", "location": { "lat": 40, "lon": -70 } } } ] } }, "_source": ["name"], "sort": [ { "_geo_distance": { "location": { "lat": 40, "lon": -70 }, "order": "asc", "unit": "km" } } ] } ``` 上述 JSON 请求定义了一个地理距离范围内的地点列表,并依据这些位置离给定坐标 `(40,-70)` 的远近程度进行了升序排序[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值