С Elasticsearch вы можете либо позволить ему автоматически определять сопоставления, используя Динамическое сопоставление (вы сохраняете ваши документы и ES строит сопоставления в соответствии с их вводом), илиВы можете определить свою схему до индексации , отправив ES с соответствующими сопоставлениями / шаблонами (файлы .json).
Использование параметра динамического сопоставления менее рекомендуется и может привести кпроблемы с отображениями (неправильный формат даты, проблемы с int / float и т. д.)
Я обычно устанавливаю свои отображения без динамической функции - если установить «строгое», то ES автоматически вызовет исключение (и будетраспространяется с любой используемой вами библиотекой)
"dynamic": "strict",
строгий: если обнаруживаются новые поля, генерируется исключение и документ отклоняется.Новые поля должны быть явно добавлены в сопоставление.
С помощью Spring-Data-Elasticsearch вы можете определить свой объект так, как вы его разместили - пометив свои поля требуемыми типами- это приведет к тому, что ElasticsearchTemplate.java проанализирует ваш Объект (взгляните на public <T> boolean putMapping(Class<T> clazz) and public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz)
) и передаст его в ES.
Вы можете проверить создание индекса / отображения Spring-es в соответствии с вашими аннотациями с помощью ElasticsearchTemplate: (Тест взят из Spring-Data-ES проекта )
@Test
public void shouldReturnMappingForGivenEntityClass() {
// given
// when
boolean created = elasticsearchTemplate.createIndex(SampleEntity.class);
elasticsearchTemplate.putMapping(SampleEntity.class);
Map<String, Object> mapping = elasticsearchTemplate.getMapping(SampleEntity.class);
// then
assertThat(created).isTrue();
assertThat(mapping).isNotNull();
assertThat(((Map<String, Object>) ((Map<String, Object>) mapping.get("properties")).get("message")).get("type"))
.isEqualTo("text");
}
И SampleEntity:
@Document(indexName = "test-index-sample-mapping", type = "mapping")
static class SampleMappingEntity {
@Id private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard")
private String message;
}
Я бы порекомендовал отделить конструкцию индекса от приложения и не использовать неявную опцию POJO-аннотации - это будет легче контролировать позже.