Аннотация @Field для Spring Data Elasticsearch не работает
У меня есть приложение Spring Boot с плагином Spring Data Elasticsearch в pom.xml. Я создал класс документа, который я хотел бы проиндексировать:
@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: не удалось загрузить узлы эластичного поиска: org.elasticsearch.index.mapper.MergeMappingException: сбой слияния со сбоями {[mapper [someTransientData] имеет разные значения индекса, mapper [someTransientData] имеет разные токены значения, mapper [someTransientData] имеет разные index_analyzer, отображение объекта [сектора] не может быть изменено с не вложенного на вложенное, mapper [operationName] имеет разные значения хранилища, mapper [operationName] имеет разные index_analyzer, mapper [dateUp] отличается type, current_type [long], merged_type [date]]}
Это ошибка Spring Data Elastic Search или я что-то не так делаю?
Я попробовал стабильную версию, предоставленную весенней загрузкой, и последний снимок spring-data -asticsearch. Я также попробовал встроенный сервер Elasticsearch, предоставляемый плагином, и внешний сервер текущей версии. Я всегда получал одинаковые результаты.