Spring Data Elasticsearch自定义分析器未加载,映射报错求助
测试Elasticsearch自定义分析器时遇到异常,相关信息如下:
settings.json内容
{ "settings": { "analysis": { "analyzer": { "my_whitespace_analyzer": { "tokenizer": "whitespace" } } } } }
索引实体类代码
import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.*; @Document(indexName = "employeedb", type="employeeDetails") @Setting(settingPath = "/elasticsearch/settings.json") public class EmployeeDetailsIndex { @Id @Field(type = FieldType.Keyword, name = "empId", store = true) //store will store the original empId as well as the analyzed one private String empId; @Field(type = FieldType.Keyword, name = "name", analyzer = "my_whitespace_analyzer", searchAnalyzer = "my_whitespace_analyzer") private String name; //Getters and Setters }
抛出的错误
failed to load elasticsearch nodes : org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=mapper_parsing_exception, reason=Mapping definition for [name] has unsupported parameters: [search_analyzer : my_whitespace_analyzer] [analyzer : my_whitespace_analyzer]]
使用版本
- Java: 1.8.0
- Elastic Search: 6.8.15
- Spring Boot: 2.2.8.RELEASE
- Spring-Data-Elasticsearch: 3.2.8.RELEASE
疑问:从错误来看settings.json似乎未被加载,已通过@Setting注解正确映射文件,参考教程均用此方式配置,请问可能的问题是什么?JSON格式是否有误?
1. JSON格式存在语法错误
你提供的settings.json末尾多了一个多余的闭合大括号},这会导致Elasticsearch无法正确解析配置文件,直接造成自定义分析器加载失败,修正后的JSON格式如上方代码所示。
2. Keyword类型字段不支持分词器配置
name字段被设置为FieldType.Keyword,而Keyword类型是不分词的,会将整个字符串作为单个关键词存储,因此不支持analyzer和searchAnalyzer参数,这是触发错误的直接原因。
如果需要对name字段使用自定义分词器,需将字段类型改为FieldType.Text:
@Field(type = FieldType.Text, name = "name", analyzer = "my_whitespace_analyzer", searchAnalyzer = "my_whitespace_analyzer") private String name;
3. 已存在的索引未更新配置
如果之前已经创建过employeedb索引,Spring Data Elasticsearch默认不会覆盖已存在的索引配置。此时需要:
- 删除已存在的
employeedb索引,重启应用让框架自动创建带自定义分析器的索引 - 或手动调用Elasticsearch API更新索引的settings和mapping
4. @Setting注解路径验证
确认settings.json文件位置是否正确:
- 若注解路径为
/elasticsearch/settings.json,文件需放在项目的src/main/resources/elasticsearch/目录下 - 检查文件名和路径是否存在拼写、大小写错误(部分环境对文件名大小写敏感)
内容的提问来源于stack exchange,提问作者Something Nice

