elasticsearch中的keyword设置ignore_above

参考: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的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值