在顺利地工作了10个多月之后,我在执行简单的搜索查询时,突然在生产上出现了这个错误。
{
"error" : {
"root_cause" : [
{
"type" : "circuit_breaking_exception",
"reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
"bytes_wanted" : 745522124,
"bytes_limit" : 745517875
}
],
"type" : "circuit_breaking_exception",
"reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
"bytes_wanted" : 745522124,
"bytes_limit" : 745517875
},
"status" : 503
}最初,当我得到这个circuit_breaking_exception错误时,我是在执行简单的术语查询时得到这个错误的,为了调试这个错误,我在elasticsearch集群上尝试了_cat/health查询,但是仍然是相同的错误,即使是最简单的查询localhost:9200也给出了相同的错误--不确定集群突然发生了什么。她是我的断路器状态:
"breakers" : {
"request" : {
"limit_size_in_bytes" : 639015321,
"limit_size" : "609.4mb",
"estimated_size_in_bytes" : 0,
"estimated_size" : "0b",
"overhead" : 1.0,
"tripped" : 0
},
"fielddata" : {
"limit_size_in_bytes" : 639015321,
"limit_size" : "609.4mb",
"estimated_size_in_bytes" : 406826332,
"estimated_size" : "387.9mb",
"overhead" : 1.03,
"tripped" : 0
},
"in_flight_requests" : {
"limit_size_in_bytes" : 1065025536,
"limit_size" : "1015.6mb",
"estimated_size_in_bytes" : 560,
"estimated_size" : "560b",
"overhead" : 1.0,
"tripped" : 0
},
"accounting" : {
"limit_size_in_bytes" : 1065025536,
"limit_size" : "1015.6mb",
"estimated_size_in_bytes" : 146387859,
"estimated_size" : "139.6mb",
"overhead" : 1.0,
"tripped" : 0
},
"parent" : {
"limit_size_in_bytes" : 745517875,
"limit_size" : "710.9mb",
"estimated_size_in_bytes" : 553214751,
"estimated_size" : "527.5mb",
"overhead" : 1.0,
"tripped" : 0
}
}我在这里发现了一个类似的问题,Github问题建议增加断路器内存或禁用同样的内存。但我不知道该选什么。请帮帮我!
Elasticsearch版本6.3
发布于 2020-05-22 11:52:21
经过进一步的研究,我终于找到了解决这个问题的办法。
要了解更多信息,请查看这是生产上的elasticsearch的JVM内存配置,堆:调整大小和交换
发布于 2021-12-12 11:20:32
在我的例子中,我有一个包含大型文档的索引,每个文档都有~30 KB和超过130个字段(嵌套对象、数组、日期和ids)。我使用这个DSL查询搜索所有字段:
query_string: {
query: term,
analyze_wildcard: true,
fields: ['*'], // search all fields
fuzziness: 'AUTO'
}因为全文搜索很昂贵。同时搜索多个字段甚至更昂贵。计算能力很昂贵,而不是存储空间。
因此:
query_string或multi_match查询目标的字段越多,速度就越慢。在多个字段上提高搜索速度的一种常用技术是在索引时将它们的值复制到单个字段中,然后在搜索时使用该字段。
请参考麋鹿医生,它建议在复制到指令的帮助下搜索尽可能少的字段。
在我将查询更改为搜索一个字段后:
query_string: {
query: term,
analyze_wildcard: true,
fields: ['search_field'] // search in one field
}一切都很有魅力。
发布于 2022-11-24 03:00:51
在我的例子中,我还有一个包含大型文档的索引,其中存储了运行日志的系统,我使用所有字段搜索索引。我使用Java客户端API,如下所示:
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("uid", uid);
searchSourceBuilder.query(termQueryBuilder);当我像这样修改代码时:
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("uid", uid);
searchSourceBuilder.fetchField("uid");
searchSourceBuilder.fetchSource(false);
searchSourceBuilder.query(termQueryBuilder);错误消失了。
https://stackoverflow.com/questions/61870751
复制相似问题