虽然我使用了spring-data-elasticsearch 2.1和elasticserch 2.4,但这有效:
@MultiField(
mainField = @Field(type = FieldType.Long, index = FieldIndex.not_analyzed),
otherFields = {@InnerField(suffix = "analyzed", store = true, type = FieldType.String, indexAnalyzer = "indexAnalyzer", searchAnalyzer = "searchAnalyzer")})
private String parameterValue;
但是当我将spring-data-elasticsearch升级到3.0并将elasticsearch升级到5.6时,我得到了: MapperParsingException :没有在字段
上声明的[Long]类型的处理程序如何解决此问题,除了创建另一个类型为Long的类属性并复制解析后的字符串值?
对于无法从String解析为Long的值而避免NumberFormatException的原因是什么?
修改 当我使用时:
@MultiField(
mainField = @Field(store = true, type = FieldType.text, analyzer = "indexAnalyzer", searchAnalyzer = "searchAnalyzer"),
otherFields = {@InnerField(suffix = "sort", type = FieldType.Long)})
private String parameterValue;
我得到了这个映射:
"parameterValue": {
"type": "text",
"fields": {
"sort": {
"type": "long"
}
}
}
这是错误的,因为未应用analyzer和searchAnalyzer以及包含自定义" indexAnalyzer"的设置文件和" searchAnalyzer"是正确的,适用于其他领域。
修改-SOLUTION:
这有效:
@MultiField(
mainField = @Field(type = FieldType.keyword),
otherFields = {@InnerField(suffix = "sort", type = FieldType.Long),
@InnerField(suffix = "analyzed", store = true, type = FieldType.text, indexAnalyzer = "indexAnalyzer", searchAnalyzer = "searchAnalyzer")})
private String parameterValue;
和映射:
"parameterValue": {
"type": "keyword",
"fields": {
"analyzed": {
"type": "text",
"analyzer": "indexAnalyzer",
"search_analyzer": "searchAnalyzer"
},
"sort": {
"type": "long"
}
}
}
我的结论是在使用spring-data-elasticsearch 3.0和elasticsearch 5.6时,我们无法在@MultiField 的主要字段中使用自定义分析器,并且需要添加另一个内部字段。主字段也不能与属性不同 - 如果我们有String属性,主字段不能是FieldType.Long但可能只是text或keyword。
这很奇怪但是现在这是我找到的唯一可行的解决方案。