加速 Elasticsearch 术语聚合 / SELECT DISTINCT

Speed up Elasticsearch terms aggregation / SELECT DISTINCT

我想知道是否可以加速 Elasticsearch 术语聚合。

我的实际目标是 select 某些查询的多个不同字段,例如,我将使用类似这样的查询。它可能会在以后包含嵌套文档:

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

所以我会找到所有以三星为公司的相关文档,并汇总其所有产品代码和国家/地区代码(它们是整数)。

有没有办法加快这样的查询?我不关心带回的实际 doc_count,我需要的只是不同的值。也许有某种提示或更好的聚合来完成这项工作?

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

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

这是因为过滤器查询是 pass/fail,而不是必须评分。

您可以做的其他事情是设置您的映射以将这些字段存储为这些字段上的 doc_values, which will substantially reduce the memory requirements necessary to perform those aggregations, and to set up eager loading,这样 ES 将预加载该数据并使其可用于聚合,而不是必须按需加载它,这将缩短响应时间。

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