背景:boo查询中过多的拼接bool导致报 too_many_clauses: maxClauseCount is set to 1024
代码语言:javascript复制"root_cause": [
{
"type": "too_many_clauses",
"reason": "too_many_clauses: maxClauseCount is set to 1024"
}
]
查询DSL语句:
代码语言:javascript复制POST sphinx-diseasedoctor/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"match_phrase": {
"diseasename": {
"query": "狼疮性肾炎",
"slop": 0,
"zero_terms_query": "NONE",
"boost": 3
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
原因:报错原因是Search限制一个bool查询中最多只能有1024个值或子查询,当超过1024时,会抛出异常。
实际原因:diseasename字段使用的分词器使用了同义词,导致“狼疮性肾炎”,被识别成了“狼疮肾炎,狼疮性肾炎,系统性红斑狼疮性肾炎”,再经过分词器分词之后,会出现很多个term,导致查询bool超过限制。
解决办法:
代码语言:javascript复制方案一:当超过1024时可以将一个bool查询拆成两个子bool查询,使用must关键字,使得两个子bool查询是与的关系
方案二:编辑elasticsearch.yml,添加如下配置
index.query.bool.max_clause_count: 10240
注意:必须在最前面添加一个空格,即和其他配置首字母对齐,不然es启动报错。
方案三:由于索引分词使用了同义词,可以将查询分词和索引分词分开,单独设置查询分词
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"match_phrase": {
"diseasename": {
"query": "狼疮性肾炎",
"slop": 0,
"analyzer": "query_ansj",
"zero_terms_query": "NONE",
"boost": 3
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}