【问题标题】:Compute percentile with collapsing by user按用户折叠计算百分位数
【发布时间】:2020-10-06 18:24:18
【问题描述】:

假设我有一个索引,可以保存一百万条推文(原始对象)。我想根据关注者的数量获得第 90 个百分位的用户。 我知道有聚合“百分位”可以做到这一点,但我的问题是 ElasticSearch 使用所有文档,所以我有一些用户发了很多推文,他们干扰了我的计算。 我想隔离所有唯一用户,然后计算第 90 个。 另一个限制是我只想在一个或两个请求中执行此操作,以保持响应低于 500 毫秒。

我已经尝试了很多东西,并且可以使用“scripted_metric”来做到这一点,但是当我的数据集超过 100k 条推文时,性能会严重下降。

有什么建议吗?

附加信息:

  • 我的索引存储基于用户搜索查询的原始推文和转发
  • 索引是用动态模板映射映射的(这个没问题)
  • 索引包含大约 100M
  • 很遗憾,“热门”聚合不接受子聚合。

我试图达到的要求是:

{
  "collapse": {
    "field": "user.id"    <--- I want this effect on aggregation
  },
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "metadatas.clientId": {
              "value": projectId
            }
          }
        },
        {
          "match": {
            "metadatas.blacklisted": false
          }
        }
      ],
      "filter": [
        {
          "range": {
            "publishedAt": {
              "gte": "now-90d/d"
            }
          }
        }
      ]
    }
  },
  "aggs":{
    "twitter": {
      "percentiles": {
        "field": "user.followers_count",
        "percents": [95]
      }
    }
  },
  "size": 0
}

【问题讨论】:

标签: elasticsearch elasticsearch-aggregation elasticsearch-performance


【解决方案1】:

最后,我想出了一个解决方法。

在百分位数聚合中,我可以使用脚本。我使用 params 变量来保存唯一键,然后返回前面的 _score。

如果没有对计算的完整解释,我无法微调脚本的行为。但结果对我来说已经足够了。

"aggs": {
    "unique":{
      "cardinality": {
        "field": "collapse_profile"
      }
    },
    "thresholds":{
      "percentiles": {
        "field": "user.followers_count",
        "percents": [90], 
        "script": {
          "source": """
            if(params.keys == null){
              params.keys = new HashMap();
            }
            
            def key = doc['user.id'].value;
            def value = doc['user.followers_count'].value;
            
            if(params.keys[key] == null){
              params.keys[key] = _score;
              return value;
            }
            return _score;
          """,
          "lang": "painless"
        }
      }
    }    
  }

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2013-06-20
    • 2016-07-28
    • 2017-08-29
    • 2012-10-28
    • 2021-02-26
    • 2017-09-04
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多