参考:https://www.phpmianshi.com/?id=217
概念
我们在ElasticSearch的官方文档上可以看到这样关于mapping中ignore_above的解释:
Strings longer than the ignore_above setting will not be indexed or stored. For arrays of strings, ignore_above will be applied for each array element separately and string elements longer than ignore_above will not be indexed or stored.
创建 mapping 时,可以为字符串(专指 keyword) 指定 ignore_above
,用来限定字符长度。超过 ignore_above
的字符会被存储,但不会被索引。
注意,是字符长度,一个英文字母是一个字符,一个汉字也是一个字符。
在动态生成的 mapping 中,keyword
类型会被设置ignore_above: 256
。
示例
这里,在特此说明一下,如果keyword字段的ignore_above设置上限超过给定的值,比如是20,那么当存储一个字段超过20个字符时,会怎么样呢。
PUT my_index
{
"mappings": {
"properties": {
"message": {
"type": "keyword",
"store": true,
"ignore_above": 20
}
}
}
}
添加测试数据
PUT _bulk
{"index":{"_index":"my_index","_id":"1"}}
{"message":"123456789"}
{"index":{"_index":"my_index","_id":"2"}}
{"message":"12345678901234567890"}
{"index":{"_index":"my_index","_id":"3"}}
{"message":"12345678901234567890123"}
验证
GET my_index/_search
结果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"message" : "123456789"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"message" : "12345678901234567890"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"message" : "12345678901234567890123"
}
}
]
}
}
验证我们可以发现,超过20个字符的数据是可以被存储的。
再来验证搜索是否可以被搜索到
GET my_index/_search
{
"query":{
"match":{
"message":"123456789"
}
}
}
GET my_index/_search
{
"query":{
"match":{
"message":"12345678901234567890123"
}
}
}
验证发现,20个以内的数据在_source中存在,20个以上的字符时不会被检索到的。
可以通过下面的方式修改ignore_above
PUT my_index
{
"mappings": {
"properties": {
"message": {
"type": "keyword",
"store": true,
"ignore_above": 10
}
}
}
}
改大改小都行,但只对新数据有效。
注意:text 类型不支持 ignore_above
总结
1. 超过ignore_above时检索是查不到的
2. 但是数据都是完整存储在source中的
3. ES5.X版本以后,keyword支持的最大长度为32766个UTF-8字符,text对字符长度没有限制。这个选项在保护 Lucene 的项的字节长度限制 32766 发挥作用。
ignore_above
值表示字符个数,但是 Lucene 计算的是字节数。如果你使用包含很多非 ASCII 字符的 UTF-8 文本,你应该将这个限制设置成 32766 / 3 = 10922
因为 UTF-8 字符可能最多占用 3 个字节。
设置ignore_above后,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
也就是说term精确匹配的最大支持的长度为32766个UTF-8个字符。
4. 下篇我们介绍 store设置true跟false的区别