
ignore_above 是 Elasticsearch 中用于 keyword 类型字段 的一个设置,它的作用是:
如果字段值的长度超过 ignore_above 指定的字符数,那么这个字段值将不会被索引,也不会被存储到倒排索引中,因此无法被搜索到。但它仍然会被存储在 _source 中(如果启用了 _source)。
这在处理长文本或日志字段时非常有用,可以避免索引过长的字符串,从而节省存储空间并提高索引性能。
示例:
创建一个带有 ignore_above 的索引
我们创建一个索引 logs,其中有一个字段 message 是 keyword 类型,并设置 ignore_above: 50,即:如果 message 字段的值超过 50 个字符,它将不会被索引,也无法被搜索到。
1 创建索引(带 ignore_above 设置)
PUT /logs
{
"mappings": {
"properties": {
"message": {
"type": "keyword",
"ignore_above": 50
}
}
}
}2 插入一些文档
✅文档1:message 长度 <= 50(会被索引)
POST /logs/_doc/1
{
"message": "This is a short message that will be indexed."
}
这条消息只有 44 个字符,小于 ignore_above: 50,所以它会被索引,可以通过 term 查询搜索到。
✅文档2:message 长度 > 50(不会被索引)
POST /logs/_doc/2
{
"message": "This is a very long message that exceeds the ignore_above limit of 50 characters and will not be indexed."
}
这条消息有 98 个字符,超过 ignore_above: 50,所以它不会被索引,无法通过 term 查询搜索到,但仍然会存储在 _source 中(如果启用了 _source)。3 测试查询
✅ 查询 message 为短文本的文档(能查到)
POST /logs/_search
{
"query": {
"term": {
"message": "This is a short message that will be indexed."
}
}
}
这个查询会返回 文档1,因为它的 message 被索引了。
❌ 查询 message 为长文本的文档(查不到)
POST /logs/_search
{
"query": {
"term": {
"message": "This is a very long message that exceeds the ignore_above limit of 50 characters and will not be indexed."
}
}
}
这个查询不会返回文档2,因为它的 message 超过了 ignore_above 限制,没有被索引。4 检查字段是否被索引
查看索引映射(确认 ignore_above 设置)
GET /logs/_mapping总结,ignore_above 生效情况:
其它:
Q1: ignore_above 对 text 类型字段有效吗?
无效。ignore_above 仅适用于 keyword 类型字段,因为 text 类型字段默认会被分词,而 keyword 是不分词的完整字符串。
Q2: 超过 ignore_above 的字段值还能被聚合吗?
不能。如果字段值超过 ignore_above,它不会被索引,因此也无法用于 terms 聚合等操作。
Q3: 如何查看哪些文档的字段被 ignore_above 过滤了?
可以通过 _termvectors API 检查某个文档的 term 是否被索引,或者使用脚本统计哪些字段值超过了 ignore_above 限制。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。