文章二十四: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"]            // 时间戳降序(最新在前)
  }
}
相关推荐
提笔了无痕2 分钟前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag
yaoxin5211235 分钟前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
陳土9 分钟前
DuckDB精读——基于Getting started with DuckDB
数据库·oracle
雪宫街道10 分钟前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
x***r15120 分钟前
linux安装 jdk-8u291-linux-x64.tar.gz 详细步骤(解压配置环境变量)
java
weixin_4684668530 分钟前
纳米 AI 搜索新手极速上手指南
人工智能·python·深度学习·搜索引擎·ai·语言模型·自然语言处理
凯瑟琳.奥古斯特36 分钟前
数据库原理选择题精选
数据库·python·职场和发展
极光代码工作室1 小时前
基于SpringBoot的校园论坛系统
java·springboot·web开发·后端开发
曹牧1 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
XS0301061 小时前
Spring Bean 作用域 & 生命周期
java·后端·spring