针对超出范围索引的弹性时间范围查询的性能

时间:2016-05-19 17:10:13

标签: elasticsearch

弹性指数通常带有日期,特别是像logstash这样的东西。

例如,您有foo-2016.05.02foo-2016.05.01等索引......

执行time range query for data时。查询索引的成本是多少,我已经知道该时间范围内没有数据?

因此,例如,如果时间范围查询仅询问2016.05.02中的数据,但我还在查询中包含df["YearMo"] = [ i[:7] for i in df["DateTaken"]] 索引。

这基本上是每个索引的快速单操作,其中索引知道它在该日期范围内没有数据,或者这样做会对性能造成代价吗?我希望不仅要知道是/否的答案,还要了解它的行为方式。

2 个答案:

答案 0 :(得分:1)

短版:它可能会很昂贵。费用为n,其中n是日期数据的不同字段值的数量。如果索引中的所有条目都具有相同的日期字段值,那么它将是1检查的廉价查询(并且因为它在那时是一个二进制“全部或全部”响应,所以将毫无意义)。当然,实际情况通常是每个单独的doc都有一个唯一的日期字段值(例如在日志中递增),具体取决于日期的精确程度(假设此处包含的时间为秒或毫秒)。 Elasticsearch将检查所包含索引的每个聚合的唯一日期字段值,以通过满足范围查询的谓词来尝试查找在该字段上匹配的文档。这是倒排索引的性质(按字段索引文档)。

提高性能的一种简单方法是将范围查询更改为范围过滤器,它可以缓存结果并提高第一个请求之外的请求的性能。当然,这只有在您重复使用相同范围过滤器(缓存读取的次数多于写入次数)时才有用,并且如果范围不是对文档进行评分的一部分(也就是说范围内的那些是当返回一组两者时,那些不在范围内的人也不会更有价值 - 也称为“助力”)。

提高性能的另一种方法是按惯例。如果按日查询,则将每一天存储在自己的滚动索引中,然后执行预搜索逻辑以选择要查询的索引。这完全消除了对过滤器或查询的需要。

答案 1 :(得分:1)

Elasticsearch不关心索引名称(包括日期),也不会自动从范围查询中排除该索引。它将查询查询中指定的所有索引的所有分片(副本 - 是副本或主副本)。周期。

另一方面,

Kibana 基于所选择的时间范围知道仅查询特定指数。

如果您知道某些索引的范围没有意义,请在创建查询之前从查询中排除这些索引。

记录usecase的常用方法是,如果最常查询当前日期,则创建alias。给它一个重要的名字 - 比如today - 它总是指向今天的索引。此外,与基于时间的指数相同的是保留期。对于这两项任务 - 管理别名和删除“过期”索引 - 您可以使用Curator

如果您关心当天的大部分时间,请使用该别名,这样您就摆脱了今天的日子。

如果没有,则根据之前的范围过滤要查询的索引决定运行查询的索引。