ESelasticsearch中的ignore_above、keyword、text限制及区别在业务系统中,遇到过两个问题:
问题1:设置为keyword类型的字段,插⼊很长的⼤段内容后,报字符超出异常,⽆法插⼊。
问题2:检索超过ignore_above设定长度的字段后,⽆法返回结果。
思考:Elasticsearch单字段⽀持的最⼤字符数?
本⽂是基于设置ignore_above之后引申的问题展开讨论与思考。
01
ignore_above的作⽤?
ES中⽤于设置超过设定字符后,不被索引或者存储。
Strings longer than the ignore_above setting will not be indexed or stored.
02
ignore_above⽤法
PUT ali_test
{
"mappings": {
"ali_type": {
"properties": {
"url": {
"type":"keyword",
"ignore_above":256
},
"url_long": {
"type":"keyword"
},
"url_long_long": {
"type":"keyword",
"ignore_above":32766
}
}
}
}
}
03
当字符超过给定长度后,能否存⼊?
验证表名,对于以上mapping中设置的url,url_long,url_long_long3个字段。超过256字符的url,都可以存⼊。
3.1 keyword类型,普通长度验证
插⼊url长度为:1705个字符,如下所⽰:
post ali_test/ali_type/1
{
"url" : "1705个字符的url"
}
检索:
GET ali_test/ali_type/_search
{
"query": {
"term": {
"url" : "1705个字符的url"
}
}
ignore和miss的区别}
返回结果:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
结论:
1705个字符,url、url_long、url_long_long都可以存⼊,可以通过head插件查看结果。
但是url term检索⽆法检索返回结果,原因: url字段设置了"ignore_above":256,导致超出256个字符后不被索引。
3.2 对于keyword类型,临界长度验证
post 32767个字符的⽂档,报错如下:
{
"error":{
"root_cause":[
{
"type":"illegal_argument_exception",
"reason":"Document contains at least one immense term in field="url_long" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped.  Please correct the analyzer to not pro
duce such terms.  The prefix of the first immense term is: '[104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 103, 111, 111, 103, 108, 101, 46, 99, 111, 109, 47, 115, 101, 97, 114, 99, 104, 63, 104]...', original message: bytes can be at most 32766 in length; got 32767"
}
],
"caused_by":{
"type":"max_bytes_length_exceeded_exception",
"reason":"max_bytes_length_exceeded_exception: bytes can be at most 32766 in length; got 32767"
}
},
"status":400
}
post 32766个字符后,能提交成功,返回结果如下:
{
"_index": "ali_test",
"_type": "ali_type",
"_id": "2000",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}
结论:keyword类型的最⼤⽀持的长度为——32766个UTF-8类型的字符。
也就是说term精确匹配的最⼤⽀持的长度为32766个UTF-8个字符。
04
text类型和keyword类型的存储字符数区别?
text类型:⽀持分词、全⽂检索,不⽀持聚合、排序操作。适合⼤字段存储,如:⽂章详情、content字段等;
keyword类型:⽀持精确匹配,⽀持聚合、排序操作。适合精准字段匹配,如:url、name、title等字段。
⼀般情况,text和keyword共存,设置mapping如下:
{
"mappings": {
"ali_type": {
"properties": {
"title_v1": {
"analyzer":"ik_max_word",
"type":"text",
"term_vector" : "with_positions_offsets",
"fields":{
"keyword":{
"ignore_above":256,
"type":"keyword"
}
}
}
}
}
}
}
05
⼩结
1)ES5.X版本以后,keyword⽀持的最⼤长度为32766个UTF-8字符,text对字符长度没有限制。2)
设置ignore_above后,超过给定长度后的数据将不被索引,⽆法通过term精确匹配检索返回结果。转载只铭毅天下

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。