Аннотация @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, игнорирует конфигурацию, заданную полем @ Примечания:
"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].д.е.Р.С. AbstractElasticsearchRepository : не удалось загрузить узлы elasticsearch: org.решение Elasticsearch.индекс.картограф.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 или я делаю что-то не так?
я попробовал стабильную версию, предоставленную spring boot и последним снимком spring-data-elasticsearch. Я также попробовал встроенный сервер Elasticsearch, предоставленный плагином, и внешний из текущей версии. Я всегда получал одни и те же результаты.
2 ответов
Я мог бы, наконец, повторить и решить проблему. Дело в том, что я использовал ElasticTemplate для индексирования и поиска документов вместо репозиториев, потому что моя бизнес-логика усложнилась (использование агрегатов и т. д.).
после этого я удалил неиспользуемый OperationDocumentRespository. Похоже, что репозиторий необходим для сопоставления типов, отправляемых на ES server при запуске. Я думал, что класса @Document должно быть достаточно, но это нет.
Итак, у нас есть два варианта:
- сохранить OperationDocumentRepository
-
добавьте эту строку в запуск приложения:
elasticsearchTemplate.putMapping(OperationDocument.class);
Я попытался реплицировать проблему, используя пример приложения spring data elasticsearch, но в соответствии с вашей конфигурацией я получаю желаемые результаты, как упоминалось выше.
весь код предназначен для проекта здесь -->ссылке
посмотрите на TestCase, которые генерируют индекс и применяют сопоставление при загрузке контекста spring--> ссылке
вот отображение, генерируемое TestCase:
{
"operations" : {
"aliases" : { },
"mappings" : {
"operation" : {
"properties" : {
"dateUp" : {
"type" : "date",
"store" : true,
"format" : "dd.MM.yyyy hh:mm"
},
"operationName" : {
"type" : "string",
"store" : true,
"analyzer" : "standard"
},
"sectors" : {
"type" : "nested"
},
"someTransientData" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
},
"settings" : {
"index" : {
"refresh_interval" : "1s",
"number_of_shards" : "5",
"store" : {
"type" : "fs"
},
"creation_date" : "1428677234773",
"number_of_replicas" : "1",
"version" : {
"created" : "1040499"
},
"uuid" : "-djzLu-IQ0CBs-M6R0-R6Q"
}
},
"warmers" : { }
}
}
можете ли вы создать аналогичный пример с помощью spring boot https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-elasticsearch
и совершить публичную акцию?