以下查询表现糟糕。
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值。不确定这是否有帮助或伤害。
答案 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。