无法在弹性搜索中更改 "maxClauseCount" 值
Not able to change "maxClauseCount" value in elastic search
我正在使用 ES 5.2.0,但在执行某些查询时出现以下异常:
Caused by: NotSerializableExceptionWrapper[too_many_clauses: maxClauseCount is set to 1024]
at org.apache.lucene.search.BooleanQuery$Builder.add(BooleanQuery.java:125)
at org.elasticsearch.index.query.BoolQueryBuilder.addBooleanClauses(BoolQueryBuilder.java:449)
at org.elasticsearch.index.query.BoolQueryBuilder.doToQuery(BoolQueryBuilder.java:418)
解决这个问题。我正在尝试通过 运行 下面的查询 "indices.query.bool.max_clause_count" 更改值
要求:
PUT http://localhost:9200/_all/_settings?preserve_existing=true
{"indices.query.bool.max_clause_count" : "100000"}
回复:
{
"error": {
"root_cause": [
{
"type": "remote_transport_exception",
"reason": "[06LrSZC][localhost:9300][indices:admin/settings/update]"
}
],
"type": "illegal_argument_exception",
"reason": "unknown setting [index.indices.query.bool.max_clause_count] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
},
"status": 400
}
我曾经解决但无法解决的参考资料:
https://discuss.elastic.co/t/5-0-0-alpha2-how-to-set-index-query-bool-max-clause-count/49816
https://github.com/elastic/elasticsearch/pull/18341
请告诉我执行此操作的正确请求 JSON。
indices.query.bool.max_clause_count
是一个静态设置,因此您应该在 elasticsearch 集群的每个节点的 elasticsearch.yml
文件中设置它。您必须重新启动集群。
使用以下行更新您的 elasticsearch.yml
文件:
indices.query.bool.max_clause_count: 100000
注意:只能使用API
更新动态设置
这是一个全局设置,不是一级索引,它的位置在 elasticsearch.yml
文件中:
indices.query.bool.max_clause_count: 10000
这就是为什么它也从 index
(单数)重命名为 indices
(复数)的原因。
查看列表的另一种可能更好的方法是将 mustNots 的数量减少为单个 must not 和多个术语。这将算作一个 mustNot,它不会触发异常,允许您保留应用程序其他地方可能需要的条款限制。
例如
上面的代码将获取 airportCode 列表,并且 "mustNot" 一次一个
// adding the blacklisted carriers to the query
BannedAirportCodeCache.instance().getAirportCodes()
.forEach(airportCode-> boolQueryBuilder.mustNot(QueryBuilders
.matchQuery("airportcodes.raw", airportCode)));
虽然上面的代码会做同样的事情,但在一个 mustNot 中,它不会触发 tooManyClauses
QueryBuilder termsQueryBuilder = QueryBuilders
.termsQuery("airportcodes.raw", BannedAirportCodeCache.instance().getAirportCodes());
boolQueryBuilder.mustNot(termsQueryBuilder);
我正在使用 ES 5.2.0,但在执行某些查询时出现以下异常:
Caused by: NotSerializableExceptionWrapper[too_many_clauses: maxClauseCount is set to 1024]
at org.apache.lucene.search.BooleanQuery$Builder.add(BooleanQuery.java:125)
at org.elasticsearch.index.query.BoolQueryBuilder.addBooleanClauses(BoolQueryBuilder.java:449)
at org.elasticsearch.index.query.BoolQueryBuilder.doToQuery(BoolQueryBuilder.java:418)
解决这个问题。我正在尝试通过 运行 下面的查询 "indices.query.bool.max_clause_count" 更改值
要求:
PUT http://localhost:9200/_all/_settings?preserve_existing=true
{"indices.query.bool.max_clause_count" : "100000"}
回复:
{
"error": {
"root_cause": [
{
"type": "remote_transport_exception",
"reason": "[06LrSZC][localhost:9300][indices:admin/settings/update]"
}
],
"type": "illegal_argument_exception",
"reason": "unknown setting [index.indices.query.bool.max_clause_count] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
},
"status": 400
}
我曾经解决但无法解决的参考资料:
https://discuss.elastic.co/t/5-0-0-alpha2-how-to-set-index-query-bool-max-clause-count/49816
https://github.com/elastic/elasticsearch/pull/18341
请告诉我执行此操作的正确请求 JSON。
indices.query.bool.max_clause_count
是一个静态设置,因此您应该在 elasticsearch 集群的每个节点的 elasticsearch.yml
文件中设置它。您必须重新启动集群。
使用以下行更新您的 elasticsearch.yml
文件:
indices.query.bool.max_clause_count: 100000
注意:只能使用API
更新动态设置这是一个全局设置,不是一级索引,它的位置在 elasticsearch.yml
文件中:
indices.query.bool.max_clause_count: 10000
这就是为什么它也从 index
(单数)重命名为 indices
(复数)的原因。
查看列表的另一种可能更好的方法是将 mustNots 的数量减少为单个 must not 和多个术语。这将算作一个 mustNot,它不会触发异常,允许您保留应用程序其他地方可能需要的条款限制。 例如 上面的代码将获取 airportCode 列表,并且 "mustNot" 一次一个
// adding the blacklisted carriers to the query
BannedAirportCodeCache.instance().getAirportCodes()
.forEach(airportCode-> boolQueryBuilder.mustNot(QueryBuilders
.matchQuery("airportcodes.raw", airportCode)));
虽然上面的代码会做同样的事情,但在一个 mustNot 中,它不会触发 tooManyClauses
QueryBuilder termsQueryBuilder = QueryBuilders
.termsQuery("airportcodes.raw", BannedAirportCodeCache.instance().getAirportCodes());
boolQueryBuilder.mustNot(termsQueryBuilder);