今天在ES中执行cardinality时报出illegal_argument_exception,提示原因是Fielddata is disabled on text fields by default. Set fielddata=true on [policyno] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.
//查询语句
{
"query":{
"match":{
"sex":"1"
}
},
"aggs":{
"distinct_count":{
"cardinality":{
"field":"policyno"
}
}
}
}
问题原因
ES中text类型的fielddata属性默认为false,因为text的cardinality可能非常大,造成内存占用过大
解决方案一(常用)
使用keyword查询
//查询语句
{
"query":{
"match":{
"flag":"1"
}
},
"aggs":{
"counts":{
"cardinality":{
"field":"policyno.keyword"
}
}
}
}
解决方案二
修改该字段的映射,设置fileddata属性为true
{
"properties": {
"policyno": {
"type": "text",
"fielddata": true
}
}
}
解决方案三
重建索引,重新定义映射关系