我有一个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
}
}
}]
}
}]
}
}]
}
}]
}
}
}
答案 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