文章二十四: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"]            // 时间戳降序(最新在前)
  }
}
相关推荐
2401_871492853 小时前
C#怎么使用泛型 C#泛型类泛型方法和泛型约束的定义和使用方法【语法】
jvm·数据库·python
无忧智库3 小时前
具身智能的数据底座之战:一个大规模三维空间语义语料库的完整工程实践(WORD)
大数据·人工智能
战南诚3 小时前
深分页问题
数据库·mysql
2301_787312433 小时前
Vue.js中Patch过程处理Teleport组件挂载位置的特殊逻辑
jvm·数据库·python
智慧化智能化数字化方案3 小时前
新零售——详解2025年度中国零售数字化及新技术应用创新案例【附全文阅读】
大数据·零售数字化·智慧零售美妆行业·智慧零售鞋服行业·智慧零售餐饮行业·慧零售食饮行业·智慧零售商超行业
Cx330❀3 小时前
Qt 入门指南:从零搭建开发环境到第一个图形界面程序
xml·大数据·开发语言·网络·c++·人工智能·qt
dfdfadffa3 小时前
Golang Gin怎么做JWT登录认证_Golang Gin JWT教程【实用】
jvm·数据库·python
m0_736439303 小时前
C#怎么实现MVVM模式 C#如何在WPF中使用MVVM设计模式分离视图和逻辑【架构】
jvm·数据库·python
名字不好奇3 小时前
RAG进阶:下一代RAG怎么玩?
数据库·人工智能