Spring Data Elasticsearch的@Field注释不起作用

我在pom.xml中有一个带有Spring Data Elasticsearch插件的Spring Boot应用程序。我创建了一个我想索引的文档类:

@Document(indexName = "operations", type = "operation")

public class OperationDocument {

@Id

private Long id;

@Field(

type = FieldType.String,

index = FieldIndex.analyzed,

searchAnalyzer = "standard",

indexAnalyzer = "standard",

store = true

)

private String operationName;

@Field(

type = FieldType.Date,

index = FieldIndex.not_analyzed,

store = true,

format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm"

)

private Date dateUp;

@Field(

type = FieldType.String,

index = FieldIndex.not_analyzed,

store = false

)

private String someTransientData;

@Field(type = FieldType.Nested)

private List<Sector> sectors;

//Getter and setters

我还为此类创建了一个存储库:

 public interface OperationDocumentRepository 

extends ElasticsearchRepository<OperationDocument, Long> {

}

我进行了一个测试,使用存储库对三个示例对象建立了索引。它很长,所以我只发布它。事实是,在ES服务器中创建的映射会忽略@Field批注设置的配置:

"mappings": {

"operation": {

"properties": {

"operationName": {

"type": "string"

},

"dateUp": {

"type": "long"

},

"someTransientData": {

"type": "string"

},

"sectors": {

"properties": {

"id": {

"type": "long"

},

"sectorName": {

"type": "string"

}

}

}

}

}

}

没有有关分析器的信息,“ someTransientData”已存储并建立索引,并且dateUp键入为Long而不是Date。

直接从服务器请求的样本文档:

 {

"_index": "operations",

"_type": "operation",

"_id": "AUyUk2cY3nXeOFxdOlQW",

"_version": 1,

"_score": 1,

"_source": {

"id": null,

"operationName": "Second Operation Name",

"dateUp": 1428421827091,

"someTransientData": "Do not index or store",

"sectors": [

{

"id": 2,

"sectorName": "Health Care"

},

{

"id": 3,

"sectorName": "Construction"

}

]

}

}

我还注意到,当我第二次运行该应用程序时,在启动时会出现此错误,仅在索引已经存在时才打印:

错误19452 — [main]

.dersAbstractElasticsearchRepository:无法加载elasticsearch节点:org.elasticsearch.index.mapper.MergeMappingException:合并失败,并失败{[mapper

[someTransientData]具有不同的索引值,映射器[someTransientData]具有不同的标记化值,mapper

[someTransientData]具有不同的index_analyzer,对象映射[sectors]无法从非嵌套更改为嵌套,mapper

[operationName]具有不同的存储值,mapper [operationName]具有不同的index_analyzer,mapper

[dateUp]不同类型,current_type [long],merged_type [date]]}

这是Spring Data Elastic Search的错误,还是我做错了什么?

我尝试了Spring Boot提供的稳定版本以及spring-data-

elasticsearch的最后一个快照。我还尝试了插件提供的嵌入式Elasticsearch服务器和当前版本的外部之一。我总是得到相同的结果。

回答:

我终于可以复制并解决问题了。事实是,我使用ElasticTemplate而不是存储库来索引和搜索文档,因为我的业务逻辑变得更加复杂(使用聚合等)。

之后,我删除了未使用的OperationDocumentRespository。似乎在启动时将类型映射发布到ES服务器需要该存储库。我以为拥有@Document类应该足够了,但事实并非如此。

因此,我们在这里有两个选择:

  • 保留OperationDocumentRepository
  • 将此行添加到应用程序启动中:
    elasticsearchTemplate.putMapping(OperationDocument.class);

以上是 Spring Data Elasticsearch的@Field注释不起作用 的全部内容, 来源链接: utcz.com/qa/435494.html

回到顶部