今天检索那边爆了一个慢查询,通过查询语句发现是检索那边某服务的一个查询, 语句类似:

{
    query: {
        user_id : 'xxxx'
    },
    size: 2147483647
}

这个查询条件比较简单,而且也是精确查询,但是花了 2秒多,问题出在 size 上, 这个巨大的 size 是 java 里的 Integer.MAX_VALUE,Elasticsearch 在查询时, 会为查询结果准备数据结构和存储空间,由于这个结果 size 巨大,所以在准备阶段话费了 巨大时间,但最后的真实结果只有几条记录。

具体可以看下面的这个链接的 Arbitrary Large Size Parameter 部分:

if the size parameter is ridiculously large, then the Elasticsearch will create a ridiculously large internal data structure. And the one who pays the price is you, waiting forever - or so it seems! - for an insignificant result.

参考链接: https://www.elastic.co/blog/found-crash-elasticsearch#too-many-shards-or-the-gazillion-shards-problem