使用sort子句优化ElasticSearch查询的最佳方法

时间:2016-10-20 00:36:15

标签: elasticsearch query-optimization real-time bigdata

我们的5节点集群中有一个庞大的索引 - 包含数十亿个文档 - 在父子映射中运行各种查询。

当我们使用sort子句时,大多数这些查询通常会超时,或者永远徘徊在这个特定的巨大索引上。

我在考虑使用某种缓存,存储第一个结果,然后对其进行排序,甚至使用一些"可扩展的作业工具"像Apache Spark一样,但会增加我们基础设施的复杂性。

任何有这种用例的人都可以提供一些想法吗?

修改

基本上我们有两种类型userevent,这是我们建模为父/子的原因 - 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"
                              }
                            }
                          }]
                        }
                      }
                    }
                  }
                }
              }]
            }
          }
        }
      }
    }

0 个答案:

没有答案