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
相关产品推荐
相关产品推荐

