加速Elasticsearch术语聚合/ SELECT DISTINCT

时间:2015-09-22 17:52:17

标签: elasticsearch elasticsearch-aggregation

我想知道是否有可能加快Elasticsearch术语聚合。

我的实际目标是为某些查询选择多个不同的字段,例如,这是一个我正在使用这样的查询。它可能稍后可能包含嵌套文档:

{
  "query" : {
    "match" : {
      "Company" : "samsung"
    }
  },
  "aggs" : {
    "Products" : {
      "terms" : {
        "field" : "ProductCode"
      }
    },
    "Countries" : {
      "terms" : {
        "field" : "CountryCode"
      }
    }
  }
}

因此,我会找到所有相关文档,其中包含三星作为其公司,并汇总其所有productCodes和countryCodes(它们是整数)。

有没有办法加快这样的查询?我不关心实际的doc_count带回来,我需要的只是不同的价值观。为了做到这一点,或许还有某种暗示或更好的聚合?

1 个答案:

答案 0 :(得分:2)

如果您使用过滤器查询而不是普通查询,它将改善您的初始运行时:

{
  "query" : {
    "filtered": {
      "term": {"yourField": "samsung"}
    }
  },
  "aggs" : {
    // ...
  }
}

这是因为过滤器查询是通过/失败的,而不是必须得分。

您可以执行的其他操作是将映射设置为doc_values,这将大大降低执行这些聚合所需的内存要求,并在这些字段上设置eager loading,这样ES就会预先加载这些数据,并将其用于聚合,而不必按需加载,这样可以缩短响应时间。

我们在doc_values的缺点方面没有太多经验 - 当你进行任何重要的聚合工作时,它们是一个明确的全面胜利。急切加载会导致刷新速度变慢,但如果您对及时查询比对刷新速度更敏感,则可以接受。