首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >elasticsearsch的ignore_above的说明

elasticsearsch的ignore_above的说明

原创
作者头像
保持热爱奔赴山海
发布2025-06-15 19:37:55
发布2025-06-15 19:37:55
4770
举报
文章被收录于专栏:数据库相关数据库相关

ignore_above 是 Elasticsearch 中用于 keyword 类型字段 的一个设置,它的作用是:

如果字段值的长度超过 ignore_above 指定的字符数,那么这个字段值将不会被索引,也不会被存储到倒排索引中,因此无法被搜索到。但它仍然会被存储在 _source 中(如果启用了 _source)。

这在处理长文本或日志字段时非常有用,可以避免索引过长的字符串,从而节省存储空间并提高索引性能。

示例:

创建一个带有 ignore_above 的索引

我们创建一个索引 logs,其中有一个字段 message 是 keyword 类型,并设置 ignore_above: 50,即:如果 message 字段的值超过 50 个字符,它将不会被索引,也无法被搜索到。

1 创建索引(带 ignore_above 设置)

代码语言:txt
复制
PUT /logs
{
  "mappings": {
	"properties": {
	  "message": {
		"type": "keyword",
		"ignore_above": 50
	  }
	}
  }
}

2 插入一些文档

代码语言:txt
复制
✅文档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 测试查询

代码语言:txt
复制
✅ 查询 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 检查字段是否被索引

代码语言:txt
复制
 查看索引映射(确认 ignore_above 设置)
GET /logs/_mapping

总结,ignore_above 生效情况:

  • 字段值长度 ≤ ignore_above 会被索引,可以被搜索
  • 字段值长度 > ignore_above 不会被索引,无法被搜索,但仍然存储在 _source 中
  • 适用字段类型 仅适用于 keyword 类型(不适用于 text 类型)

其它:

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档