ElasticSearch查询太大

时间:2018-09-25 19:01:12

标签: elasticsearch

我有一个ElasticSearch查询,该查询似乎导致ElasticSearch返回504“请求无法到达服务器(状态代码:504)”。这似乎是由于查询的大小,因为如果我拉出一些参数,它将起作用。

我正在尝试在几天(最多21天)内返回多个位置(可能是数百个)的匹配数据。每个位置都需要查看特定的时间范围。以下只是较大查询的一小部分示例,但是在更多位置上基本上是相同的。

是否有一种更好的方式来编写查询,而不是我目前有这种查询方式,当我在很多地方都无法运行成为一个非常大的查询吗?

{
"size": 10,
"sort": [{
    "@timestamp": {
        "order": "asc"
    }
}],
"_source": ["name", "location", "@timestamp"],
"query": {
    "bool": {
        "must": [{
            "bool": {
                "should": [{
                    "bool": {
                        "must": [{
                            "bool": {
                                "should": [{
                                    "geo_polygon": {
                                        "location": {
                                            "points": ["-14.0625,12.65625", "-15.46875,12.65625", "-15.46875,11.25", "-14.0625,11.25", "-14.0625,12.65625"]
                                        }
                                    }
                                }]
                            }
                        }, {
                            "bool": {
                                "should": [{
                                    "range": {
                                        "@timestamp": {
                                            "lte": 1537809912161,
                                            "format": "epoch_millis",
                                            "gte": 1537747200000
                                        }
                                    }
                                }]
                            }
                        }]
                    }
                }, {
                    "bool": {
                        "must": [{
                            "bool": {
                                "should": [{
                                    "geo_polygon": {
                                        "location": {
                                            "points": ["60.46875,22.5", "59.0625,22.5", "59.0625,21.09375", "60.46875,21.09375", "60.46875,22.5"]
                                        }
                                    }
                                }]
                            }
                        }, {
                            "bool": {
                                "should": [{
                                    "range": {
                                        "@timestamp": {
                                            "lte": 1537808898616,
                                            "format": "epoch_millis",
                                            "gte": 1537747200000
                                        }
                                    }
                                }, {
                                    "range": {
                                        "@timestamp": {
                                            "lte": 1537721508544,
                                            "format": "epoch_millis",
                                            "gte": 1537660800000
                                        }
                                    }
                                }]
                            }
                        }]
                    }
                }]
            }
        }]
    }
}
}

1 个答案:

答案 0 :(得分:0)

在新版本中,大查询为400错误代码。您可以在日志中查找错误

sudo tail -n 200 /var/log/elasticsearch/elasticsearch.log
sudo tail -n 200 /var/log/elasticsearch/elasticsearch.log | grep maxClauseCount

如果有行

Caused by: org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024

然后,您必须进行大查询,并且需要增加maxClauseCount。为此添加行

indices.query.bool.max_clause_count: 10000

到文件/etc/elasticsearch/elasticsearch.yml