如何在elasticsearch中使用FieldType.Long作为String

时间:2018-03-16 21:11:58

标签: java spring-boot elasticsearch elasticsearch-5 spring-data-elasticsearch

虽然我使用了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。

这很奇怪但是现在这是我找到的唯一可行的解​​决方案。

0 个答案:

没有答案