本文主要围绕以下两个问题展开:
1、通常情况下keyword类型写入时字段超长问题
2、设置了ignore_above参数后还存在字段超长问题

报错示例:
Document contains at least one immense term in field=“message” (whose UTF8 encoding is longer than
the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: ‘[123, 34, 84, 97, 98, 108, 101, 115, 34,
58, 91, 123, 34, 67, 111, 108, 117, 109, 110, 115, 34, 58, 91, 123, 34, 68, 97, 116, 97, 84]…’, original message: bytes can be at most 32766 in length; got 33804
此提示是告诉message字段写入内容超长了

keyword类型写入时字段超长问题如何解决

概念一:ES(Lucene)为keyword类型提供的存取空间是32766字节。
概念二:ignore_above参数作用,在字段内容超长时能够截取一定长度(注意是长度)内容作为keyword类型索引。超出长度的字段内容不被索引,即该部分内容不支持关键字检索。
那查询时为什么能返回字段的全部内容??原因在于ES存储和索引是分开的,查询时返回的文本内容是从ES存储(即doc)获取的。

解决办法:通过设置ignore_above参数来解决字段超长的问题。

设置了ignore_above参数还存在字段超长问题

可能存在这种情况。明明设置了ignore_above参数,但是还存在字段超长问题。且字段超长问题有时候会出现,有时候即使该字段内容大小达到了几M也不会触发。
这时你可能会怀疑ignore_above参数的作用,请不要怀疑。ignore_above参数还在正常工作,只是你使用错了。
查看上面ignore_above参数作用说明,ignore_above参数是通过字符串长度进行截取的。如果你ignore_above参数设置过大,比如20000。
在写入数据只是英文字符时,即使数据体内容再大也不会引起字段超长问题。
在写入数据包含中文时,就可能出现问题。因为中文一个字占4个字节,20000长度的中文远超过了32766字节,因此报错。

所以请检查你的索引结构及写入的文档内容。。。
如果存在中文,ignore_above参数值的最大可设置为32766/4 = 8191

ignore_above参数有那些隐藏风险

查询不到数据。如果存入内容长度超过了ignore_above设置的值,此时通过该字段keyword类型检索不到该文档。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐