我在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类应该足够了,但事实并非如此。
因此,我们在这里有两个选择:
elasticsearchTemplate.putMapping(OperationDocument.class);