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

目录
相关文章
|
3月前
|
算法 Go 区块链
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
23 0
|
12月前
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
78 0
|
12月前
|
分布式计算 算法 大数据
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
68 0
|
JavaScript 前端开发 开发者
分分钟带你了解 ES2022 最重要的 4 个特性!
ECMAScript 2022 将于今年 6 月发布,本篇带来 ES2022 肯定会出现的最重要的 4 个变化!因为这些特性已经进入了 TC39 标准化发布的 第 4 个阶段 了。
|
SQL 移动开发 BI
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
怎样对数据组合重新排列并去重的问题、通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本篇文章主要介绍的两个方面,第一个方面曾经有好几个网友和同事问我,第二个问题真的是很多同行的通病,认为分析函数是万金油,一股脑用。
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
es 平行多次聚合查询
es 平行多次聚合查询
103 0
|
算法 测试技术 分布式数据库
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
|
SQL Java UED
ES中如何实现对查询结果的二次排序
ES中如何实现对查询结果的二次排序
398 0
|
SQL 关系型数据库 MySQL
ES中如何实现类似having的先聚合再过滤查询
ES中如何实现类似having的先聚合再过滤查询
418 0
ES中如何实现类似having的先聚合再过滤查询
|
存储 JSON 自然语言处理
multi-class分类模型评估指标的定义、原理及其Python实现
本文介绍multi-class分类任务中的模型评估指标及其使用Python的实现方式(包括使用sklearn进行实现,以及使用原生Python函数进行实现的操作)。 本文使用的示例是在英文多标签文本分类数据集AAPD数据集上,使用fastText包运算得到的多标签分类结果,与真实标签之间计算对应的指标结果(原则上使用one-label标签应该也能这么算,我就不另写了)。本文第一节将介绍相应数据的处理方式,第二节及其后是各指标的原理和计算方式。
multi-class分类模型评估指标的定义、原理及其Python实现