真实给keyword字段设一个很短的ignore_above,写入一条超长值,验证这个值会不会被索引、会不会被拒绝写入、_source里还在不在。
代码PUT /ignore_above_test {"mappings": {"properties": {"code": {"type": "keyword", "ignore_above": 10}}}} POST .../_doc/1 {"code": "SHORT"} # 5字符,没超 POST .../_doc/2 {"code": "THIS-IS-A-VERY-LONG-CODE-VALUE"} # 31字符,超了 GET .../_search {"query":{"term":{"code":"THIS-IS-A-VERY-LONG-CODE-VALUE"}}}
term查询"SHORT"(5字符,没超过ignore_above:10) → hits = 1 ← 真实能查到 term查询"THIS-IS-A-VERY-LONG-CODE-VALUE"(31字符,超了)→ hits = 0 ← 真实查不到 即使这个term查询用的是跟原文档一字不差的精确字符串!
这是ignore_above真实的作用机制:它不是"截断超长值再存一部分",而是真实把超过这个字符数的值整个排除在倒排索引之外——doc 2的code字段值真实有31个字符,超过了ignore_above:10的限制,ES真实选择完全不给这个值建索引,所以不管后续用什么条件去term查询(哪怕是跟原文档一模一样的精确字符串),这个字段在这份倒排索引里真实根本不存在这个值的任何踪迹。
GET /ignore_above_test/_doc/2
→ _source.code = "THIS-IS-A-VERY-LONG-CODE-VALUE" ← 真实完整的31字符,一个都没少
GET /ignore_above_test/_search {"query":{"match_all":{}}}
→ hits.total.value = 2 ← 真实两条文档都在,doc 2真实没有被拒绝写入每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
keyword 字段 ignore_above 设置