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中如何实现随机抽样查询,并强调了随机抽样查询的性能损耗问题以及对应的解决方案。

目录
相关文章
ElasticSearch Task命令说明
ElasticSearch task相关命令,以及返回信息解读。
5780 0
ElasticSearch Task命令说明
|
存储 缓存 监控
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出 本文来带大家学习Java OOM的三大经典场景以及解决方案,保证让你有所收获!
6053 0
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
|
应用服务中间件 Linux 网络安全
Linux 安装 Nginx 并配置为系统服务(超详细)
Linux 安装 Nginx 并配置为系统服务(超详细)
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
261165 0
|
Java 关系型数据库 BI
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
1931 0
ES自定义评分机制:function_score查询详解
|
安全 Linux 网络安全
SSH远程登陆配置sshd_config文件详解
ssh是linux远程登录的安全协议,是 C/S 模式的架构,配置文件分为服务器端配置文件 [/etc/ssh/sshd_config] 与客户端配置文件默认配置文件[/etc/ssh/ssh_config] 用户配置文件[~/.ssh/config] sshd_config 是服务端主配置文件。
|
人工智能 Java
通过okhttp调用SSE流式接口,并将消息返回给客户端
通过okhttp调用SSE流式接口,并将消息返回给客户端