默认分值排序:
在es进行全文检索时,会根据内容进行排序,这个时默认的排序手段
通过语法糖对于指定排序规则。
GET citibike/_search
{
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"query":{
"bool": {
"must": [
{
"match": {
"member_casual": {
"query": "member"
}
}
}
]
}
}
}
使用script_score脚本计算分数
GET citibike/_search
{
"query": {
"script_score": {
"script": {
"source": """
_score+(doc['ride_id.keyword'].value.length()*0)
"""
},
"query": {
"bool": {
"must": [
{
"match": {
"member_casual": {
"query": "member"
}
}
}
]
}
}
}
}
}
自定义字段排序:
这个字段的排序是基于列式存储doc_value进行的存储。他的性能是高于使用_score进行排序的。
GET citibike/_search
{
"sort": [
{
"start_station_id.keyword": {
"order": "desc"
}
}
],
"query":{
"bool": {
"must": [
{
"match_all": {
}
}
]
}
}
}
如果我们设置的排序字段是数组,一个数组中有多个数据,这是我们可以使用mode这个参数规定使用数组中的哪个数据进行排序
GET citibike/_search
{
"sort": [
{
"start_station_id.keyword": {
"order": "desc",
"mode": "min" #可以设置成min,max,sum avg,
}
}
],
"query":{
"bool": {
"must": [
{
"match_all": {
}
}
]
}
}
}
高级查询排序实战
上面小编为大家带来了常用的使用方式,接下来为大家带来高级的玩法。
GEO距离排序
使用案例
GET citibike/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"member_casual": "member"
}
}
]
}
},
"sort": [
{
"_geo_distance": {
"ended_at": {
"lat": 40,
"lon": -70
},
"unit": "km",
"order": "asc",
"distance_type": "arc"
}
}
]
}
_script脚本自定义排序:
GET citibike/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_script":{
"type":"number",
"script":{
"source": """
doc['rideable_type.keyword'].value.length()*10
"""
},
"order": "desc"
}
}
]
}
运行时字段进行排序:
在进行查询时,创建运行时字段,使用运行时字段进行排序也是es中可以排序的方式,下面使用案例为大家展示一下:
GET citibike/_search
{
"runtime_mappings": {
"double_member_casual_length": {
"type": "double",
"script": {
"lang": "painless",
"source": """
emit(doc['member_casual.keyword'].value.length()*2)
""",
"params": {
}
}
}
},
"sort": [
{
"double_member_casual_length": {
"order": "desc"
}
}
],
"fields": [
"double_member_casual_length"
]
}
Function scode自定义打分机制:
具体讲解参照:文章十八:Elasticsearch 多条件组合查询实战运用-CSDN博
这里讲解了一些function_score的知识和学习建议。
GET citibike/_search
{
"query": {
"function_score": {
"query": {}, // 可以写匹配条件,不写就是查所有
"functions": [
{
"script_score": {
"script": "_score * doc['f'].value"
}
},
{
"script_score": {
"script": "_score * doc['f'].value"
}
}
],
"score_mode": "sum" // 多个函数结果相加
}
}
}
ES数据写入排序应用
es在进行数据的写入时,他是根据你的写入的时间顺序进行顺序的写入,根据写入的时间生成分段文件,如果我们按着某一个字段的顺序写如的话,在查询时会提高效率。
总体就是一句话:让es的分段文件具有一定的顺序性
概述
index.sort.field 是 Elasticsearch 官方内置的索引层级配置参数,属于底层物理预排序 设置。区别于查询时动态排序,该参数用于在数据写入磁盘阶段,提前对索引文档进行物理排序,是优化大规模数据排序查询性能的核心配置。
配套参数:
-
index.sort.field:指定索引预排序的字段列表(数组格式)
-
index.sort.order:对应排序字段的排序规则(asc/desc,数组格式,与字段一一对应)
-
index.sort.mode:如果是数组类型的字段,可以指定格式 可选值:
min:用数组最小值max:用数组最大值,sum:求和,avg:求平均
使用案例:
PUT my_index
{
"settings": {
"index.sort.field": ["timestamp"], // 按时间戳预排序
"index.sort.order": ["desc"] // 时间戳降序(最新在前)
}
}