我们的5节点集群中有一个庞大的索引 - 包含数十亿个文档 - 在父子映射中运行各种查询。
当我们使用sort
子句时,大多数这些查询通常会超时,或者永远徘徊在这个特定的巨大索引上。
我在考虑使用某种缓存,存储第一个结果,然后对其进行排序,甚至使用一些"可扩展的作业工具"像Apache Spark一样,但会增加我们基础设施的复杂性。
任何有这种用例的人都可以提供一些想法吗?
修改:
基本上我们有两种类型user
和event
,这是我们建模为父/子的原因 - events
具有巨大的吞吐量。通常,我们按一些custom_data
或其他嵌套文档字段排序,例如revenue
。
这两种类型的映射:
https://gist.github.com/allansene/5e1e1743b5cbdbd337a19b066fbe8e9b
下面的查询示例。没有任何排序条款,花了51s:
{
"query": {
"filtered": {
"filter": {
"and": {
"filters": [{
"has_child": {
"type": "event",
"filter": {
"term": {
"action": "acessou-pagamento"
}
}
}
}, {
"not": {
"filter": {
"has_child": {
"type": "action",
"filter": {
"and": {
"filters": [{
"term": {
"action": "comprou-ingresso"
}
}, {
"range": {
"updated_at.date": {
"gte": "2016-10-23||/d"
}
}
}]
}
}
}
}
}
}]
}
}
}
}
}