Аннотация @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 - - - [главная].D.e.r.s. AbstractElasticsearchRepository: не удалось загрузить узлы elasticsearch : орг..решение Elasticsearch.индекс.картограф.MergeMappingException: слияния не удалось со сбоями {[маппер [someTransientData] имеет различные значения Индекса, маппер [someTransientData] имеет различные маркировки значений, маппер [someTransientData] имеет различные index_analyzer, объект сопоставления [секторов] нельзя без вложенных вложенных, маппер [имя_операции] имеет различные значения, маппер [имя_операции] имеет различные index_analyzer, маппер [dateUp] разного вида, current_type [долго], merged_type [дата]]}




Это ошибка эластичного поиска данных Spring или я делаю что-то не так?



Я попробовал стабильную версию, предоставленную spring boot и последним снимком spring-data-elasticsearch. Я также попробовал встроенный сервер Elasticsearch, предоставляемый плагином, и внешний сервер текущей версии. Я всегда получал одни и те же результаты.

575   2  

2 ответов:

Наконец-то я смог воспроизвести и решить эту проблему. Дело в том, что я использовал ElasticTemplate для индексирования и поиска документов вместо репозиториев, потому что моя бизнес-логика стала более сложной (использование агрегатов и т. д.).

После этого я удалил неиспользуемые OperationDocumentRespository. Похоже, что репозиторий необходим для отображения типов, которые будут отправлены на сервер ES при запуске. Я думал, что достаточно иметь класс @ Document, но это не так.

Итак, мы есть два варианта здесь:

  • сохраняйте операцию Documentrepository
  • Добавьте эту строку в запуск приложения:

    elasticsearchTemplate.putMapping(OperationDocument.class);
    

Я попытался воспроизвести проблему, используя пример приложения spring data elasticsearch, но в соответствии с вашей конфигурацией я получаю желаемые результаты, как упоминалось выше.

Весь код предназначен для проецирования здесь -- > link

Посмотрите на TestCase, которые генерируют индекс и применяют отображение при загрузке контекста spring--> link

Вот отображение, генерируемое 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

И совершить на публичной акции?

Comments

    Ничего не найдено.