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

目录
相关文章
|
存储 自然语言处理 算法
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
|
6月前
去重Cube的优化实践问题之直接计算去重类指标的方法具体问题如何解决
去重Cube的优化实践问题之直接计算去重类指标的方法具体问题如何解决
|
存储 固态存储 测试技术
优化后,ES 做到了几十亿数据检索 3 秒返回!
优化后,ES 做到了几十亿数据检索 3 秒返回!
|
分布式计算 算法 大数据
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
113 0
|
数据挖掘
白话Elasticsearch53-深入聚合数据分析之Collect Model_bucket优化机制:深度优先、广度优先
白话Elasticsearch53-深入聚合数据分析之Collect Model_bucket优化机制:深度优先、广度优先
90 0
|
算法 测试技术 分布式数据库
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
ES本地分片逆文档频率评分策略(Shard Local IDF)导致的评分异常原理解析
|
SQL 关系型数据库 MySQL
ES中如何实现类似having的先聚合再过滤查询
ES中如何实现类似having的先聚合再过滤查询
602 0
ES中如何实现类似having的先聚合再过滤查询
es 平行多次聚合查询
es 平行多次聚合查询
145 0
|
Ubuntu Java 程序员
Elasticsearch聚合学习之五:排序结果不准的问题分析
Elasticsearch聚合后娶TopN的时候,经常会出现不准确的问题,今天就通过实战来分析这个问题
418 0
Elasticsearch聚合学习之五:排序结果不准的问题分析
|
Ubuntu Java 程序员
Elasticsearch聚合学习之二:区间聚合
本文是《Elasticsearch聚合学习》系列的第二篇,上一篇是我们熟悉了聚合的基本操作,本篇的内容是按照区间聚合的实战操作
102 0
Elasticsearch聚合学习之二:区间聚合