【发布时间】: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
}
【问题讨论】:
-
请参考stackoverflow.com/a/64180300/4039431 看看是否有帮助,也请分享索引详细信息、查询和集群信息,就像在同一线程中讨论的一样
标签: elasticsearch elasticsearch-aggregation elasticsearch-performance