ES中如何实现随机抽样查询

简介: ES中如何实现随机抽样查询

一、场景说明


索引中有几千万的数据,现在需要每次查询随机抽样返回10条数据,怎么实现?


二、实现方式


DSL语句执行如下:


GET myIndex/_search
{
  "from": 0,
  "size": 20,
  "timeout": "10s",
  "sort": {
    "_script": {
      "script": "Math.random()",
      "type": "number",
      "order": "asc"
    }
  }
}

java代码实现:

private void randomSort(SearchSourceBuilder sourceBuilder){
    Script script = new Script("Math.random()");
    ScriptSortBuilder sortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER);
    sourceBuilder.sort(sortBuilder);
}


三、注意事项


实际开发过程中发现,如果对索引中的全量数据进行随机抽样查询是非常消耗查询性能的。


我遇到的情况:

生产环境上,8千万多万数据的索引进行随机抽样查询耗时5s,这种查询速度显然是不能接受的。

97.png


优化改进:

sort排序是针对匹配的所有数据进行排序,而8000多万数据的随机排序,显然非常耗时。

我们可以在查询条件中增加一些随机查询条件,比如主键id的随机前缀匹配,数据产生时间的随机范围匹配,

从而减轻随机匹配的性能损耗。


由于我的索引数据中id的前缀都是在0~9,所以我在每次查询时,先生成0~9的随机数,然后去匹配主键id做前缀匹配。


{
  "query": {
    "wildcard": {
      "id": {
        "value": "1*"
      }
    }
  }
  ,"sort":[{"_script":{"script":{"source":"Math.random()","lang":"painless"},"type":"number","order":"asc"}}]
}

96.png

可以发现,每次随机查询匹配的数据量total的直显著下降,消耗的查询时间took也明显降低,完全能满足生产要求。


总结


本文主要介绍了ES中如何实现随机抽样查询,并强调了随机抽样查询的性能损耗问题以及对应的解决方案。

目录
相关文章
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
|
消息中间件 缓存 前端开发
COLA架构 入门
COLA架构 入门
4860 0
elasticsearch hanlp 插件安装操作
简要简述elasticsearch hanlp插件的基本安装操作
elasticsearch hanlp 插件安装操作
|
存储 自然语言处理 Java
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
1300 0
|
NoSQL Java Redis
redis: jedis连接超时(需要手动注入连接超时检测的配置)
redis: jedis连接超时(需要手动注入连接超时检测的配置)
1529 0
|
存储 缓存 自然语言处理
Elasticsearch 查询性能优化:从 3 秒到 300ms 的 6 个核心参数调优指南
本文分享某电商平台 Elasticsearch 性能调优实战,通过调整分片数、刷新间隔、缓存配置等 6 个核心参数,将商品搜索从 3 秒优化至 300 毫秒,显著提升查询性能与系统吞吐量。内容涵盖性能诊断、参数调优逻辑、实操方案及避坑指南,助力高频查询场景下的 ES 优化。
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
2396 0
ES自定义评分机制:function_score查询详解
|
数据采集 API 开发工具
项目支付接入支付宝【沙箱环境】
该博客文章详细介绍了如何在PC端项目中接入支付宝支付功能,特别是在沙箱环境中的配置和实现步骤。文章提供了详细的配置指南,包括获取支付宝公钥和私钥、配置沙箱应用环境、生成密钥、设置服务端代码以及调用支付接口等步骤,并附有相应的代码示例和说明。
项目支付接入支付宝【沙箱环境】
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
10285 7