可怕的has_child查询性能

时间:2016-03-02 03:18:31

标签: elasticsearch

以下查询表现糟糕。

100%确定它是has_child。没有它的查询运行在300ms以下,需要9秒。

有没有更好的方法来使用 has_child 查询?看起来我可以查询父母,然后通过id然后加入客户端,以便比ES数据库引擎更快地执行子检查...

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "has_child": {
                                "type": "status",
                                "query": {
                                    "term": {
                                        "stage": "s3"
                                    }
                                }
                            }
                        },
                        {
                            "has_child": {
                                "type": "status",
                                "query": {
                                    "term": {
                                        "stage": "es"
                                    }
                                }
                            }
                        }
                    ]
                }
            },
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "source": "IntegrationTest-2016-03-01T23:31:15.023Z"
                            }
                        },
                        {
                            "range": {
                                "eventTimestamp": {
                                    "from": "2016-03-01T20:28:15.028Z",
                                    "to": "2016-03-01T23:33:15.028Z"
                                }
                            }
                        }
                    ]
                }
            }
        }
    },
    "aggs": {
        "digests": {
            "terms": {
                "field": "digest",
                "size": 0
            }
        }
    },
    "size": 0
}

群集信息: CPU和内存使用率很低。它是AWS ES服务集群(v1.5.2)。许多小文档,并且自版本aws运行以来,默认情况下不会启用doc值。不确定这是否有帮助或伤害。

2 个答案:

答案 0 :(得分:0)

由于未对“阶段”进行分析(根据您的评论),因此您对对该字段匹配的文档进行评分不感兴趣,因此使用has_child 过滤而不是has_child 查询。使用term 过滤器代替term 查询

has_child { "query": { "filtered": { "filter": { "bool": { "must": [ { "term": { "source": "IntegrationTest-2016-03-01T23:31:15.023Z" } }, { "range": { "eventTimestamp": { "from": "2016-03-01T20:28:15.028Z", "to": "2016-03-01T23:33:15.028Z" } } }, { "has_child": { "type": "status", "filter": { "term": { "stage": "s3" } } } }, { "has_child": { "type": "status", "filter": { "term": { "stage": "es" } } } } ] } } } }, "aggs": { "digests": { "terms": { "field": "digest", "size": 0 } } }, "size": 0 } 中,您会注意到:

  

has_child过滤器也接受过滤器而不是查询:

使用过滤器的主要性能优势来自Elasticsearch可以跳过查询的评分阶段。此外,可以缓存过滤器,这可以提高使用相同过滤器的未来搜索的性能。另一方面,查询无法缓存。

请改为尝试:

{{1}}

答案 1 :(得分:-1)

我咬了一下子弹,刚刚执行了父:孩子加入我的申请。我没有等待7秒的has_child查询,而是关闭两个连续的术语查询并进行一些后处理:200ms。