文章二十四: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"]            // 时间戳降序(最新在前)
  }
}
相关推荐
ck-joker1 分钟前
M1 Pro跑LLM实测:Ollama+LangChain4j零成本本地大模型开发,比云端API快在哪?
java·语言模型
丙氨酸長鏈35 分钟前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
Nontee36 分钟前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
我是唐青枫38 分钟前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java·开发语言
远航计算机1 小时前
职业技能培训机构如何利用QClaw+Skills做豆包GEO:知识库搭建×内容创作×效果监测的完整实操手册
大数据·人工智能·自动化·aigc·火山引擎
IanSkunk1 小时前
视光中心承接近视防控需求,核心是先把服务流程做成标准化工程
大数据
眞bilibili1 小时前
带团队后的日常思考(十七)
数据库
SEO_juper1 小时前
用Google Search Console数据做内容审计:找出网站上哪些页面在“吃白饭“
大数据·人工智能·外贸独立站
laboratory agent开发2 小时前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库
晨曦中的暮雨2 小时前
Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告
java·并发·个人项目