文章二十四:Elasticsearch查询排序应用实战e

默认分值排序:

在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"]            // 时间戳降序(最新在前)
  }
}
相关推荐
小bo波12 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
大大大大晴天12 小时前
Hudi技术内幕:Key Generation原理与实践
大数据
Elasticsearch15 小时前
3个信号、2个环境变量、0个采集器:使用 Python 和 Elastic 的托管 OTLP 端点实现 OpenTelemetry
elasticsearch
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
Elasticsearch3 天前
如何通过 Claude Code 来写入 CSV 数据到 Elasticsearch
elasticsearch
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库