You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch 6.1.1:使用Transport Client设置not_analyzed字段报错求助

解决Elasticsearch 6.1.1 Transport Client设置字段不分析的问题

这个报错的原因很明确——在Elasticsearch 6.x版本中,index参数已经不再接受not_analyzed这个值了,它现在是布尔类型,只能设置为true或false。你想要的“字段不被分词分析”的效果,需要改用keyword字段类型来实现,这是Elasticsearch 5.x之后就推行的标准做法,6.x彻底移除了对not_analyzed的支持。

两种解决方案

1. 字段仅需精确匹配(无需全文搜索)

如果这个字段只需要做精确匹配、聚合或者排序,直接把字段类型设为keyword即可,默认就是不分析的状态,不需要额外设置index参数:

.startObject("message")
.field("type", "keyword") // 直接使用keyword类型,天然不分析
.endObject()

2. 字段同时需要全文搜索和精确匹配

如果这个字段既要支持全文检索(比如模糊搜索内容),又需要精确匹配(比如按完整值过滤、聚合),可以给text类型字段添加一个keyword子字段:

.startObject("message")
.field("type", "text") // 用于全文搜索
.startObject("fields")
    .startObject("keyword")
        .field("type", "keyword") // 用于精确匹配、聚合
        .field("ignore_above", 256) // 可选,限制字段长度,避免过大值占用空间
    .endObject()
.endObject()
.endObject()

使用这种方式时,搜索全文用message字段,精确匹配用message.keyword字段。

修改后的核心映射代码示例

针对你的代码,所有原来设置index: not_analyzed的字段都需要调整,比如message、keywords、providername等字段,下面是修改后的核心部分:

String mapping = XContentFactory.jsonBuilder()
        .startObject()
        .startObject("delllogfiles")
        .startObject("properties")
        // message字段改为keyword类型(仅精确匹配)
        .startObject("message")
        .field("type","keyword")
        .endObject()
        // logid保持long类型
        .startObject("logid")
        .field("type","long")
        .endObject()
        // qualifiers改为text+keyword子字段(同时支持全文和精确匹配)
        .startObject("qualifiers")
        .field("type","text")
        .startObject("fields")
            .startObject("keyword")
                .field("type","keyword")
            .endObject()
        .endObject()
        .endObject()
        // keywords字段改为keyword类型
        .startObject("keywords")
        .field("type","keyword")
        .endObject()
        // providername字段改为keyword类型
        .startObject("providername")
        .field("type","keyword")
        .endObject()
        // 剩余字段按上述规则调整即可
        .endObject()
        .endObject()
        .endObject()
        .string();

额外注意点

  • Elasticsearch 6.x中,一个索引只能有一个默认类型(你的代码里用了delllogfiles作为类型,这在6.x是允许的,但7.x之后彻底移除了类型,不过你用6.1.1暂时不用考虑这个)。
  • 修改完映射后,重新运行代码,就能正常创建索引了,不会再出现MapperParsingException。

内容的提问来源于stack exchange,提问作者D vignesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:42:45