概述
排序:es支持对于检索结果进行排序,通常默认的检索是根据相关度算分(_score)降序排序,相关度较高的数据排在最前。我们也可以指定排序字段和排序方式自定义排序,此时相关度算分就不会执行,执行效率会有提升。
排序字段类型:keyword、地理坐标、date、数值
排序DSL语法
POST /book/_search
{
"query": { #查询语句
"match_all": {}
},
"sort": [ #排序是数组,说明支持多个排序字段,
{ 如果靠前的字段排序相同,则根据下一个字段继续排序
"FIELD": { #指定排序字段
"order": "desc" #指定排序方式
}
}
],
"_source": [ #指定返回数据的字段值
"field1",
"field2",
"field3"
]
}
查询操作
#排序
POST /book/_search
{
"query": {
"match_all": {} #查询全部文档
},
"sort": [
{ #根据豆瓣评分降序排序
"douBanScore": {
"order": "desc"
}
},
{ #根据价格升序排序,这里的写法与上面相比更简洁,但是作用是相同的
"price": "asc"
}
],
"_source": [ #返回文档的题名,价格,豆瓣评分
"title",
"price",
"douBanScore"
]
}
检索结果:
地理坐标排序
#排序
POST /my-index-000001/_search?pretty
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": { #地址坐标距离排序
"FIELD": {
"lat": 40, #纬度坐标
"lon": -70 #经度坐标
},
"order": "asc", #排序方式为升序,距离最近的排在最前
"unit": "km"
}
}
]
}
检索结果:
时间:2022年6月26日12:05:50
问题:假如id是keyword类型,按照id正序排序,id为10,11,12…19的数据会排在id为2的前面,而不是按照1,2,3。。。。这种顺序出来的
需求整理:keyword类型但是存储的是数值的字段,如何按照数值正序或降序排序
准备工作:
# 创建索引
PUT /test/
#建立mapping,注意id设置的是keyword类型
PUT /test/_mapping
{
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
#批量增加数据
PUT /test/_doc/_bulk
{"create":{"_id": "1001"}}
{"id": "1", "name" : "罗辑"}
{"create":{"_id": "1002"}}
{"id": "2", "name" : "程心"}
{"create":{"_id": "1003"}}
{"id": "11", "name" : "维德"}
{"create":{"_id": "1004"}}
{"id": "12", "name" : "泰勒"}
按照普通的排序方式
POST /test/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"id": {
"order": "asc"
}
}
]
}
查询结果
解决方案:
POST /test/_search
{
"query": {
"match_all": {}
},
"sort": {
"_script": {
"script": {
"lang": "painless",//lang默认的值为"painless",即使不写默认为painless
"source": "Integer.parseInt(doc['id'].value)" //将id的值转换为integer类型
},
"type": "number",
"order": "asc"
}
}
}
查询结果: