Использовать аннотации spring-data -asticsearch вместе с Jackson ObjectMapper? - PullRequest
1 голос
/ 27 июня 2019

Предположим, что есть некоторые POJO для записи в индекс Elasticsearch.Из моего ограниченного опыта работы с ES каждое поле получает тип (например, текст, ключевое слово, ...).Можно ли настроить Jackson ObjectMapper с аннотациями из spring-data -asticsearch для настройки типа сериализованного Json?Как пример:

@Document(indexName = "books", type = "book")
public class Book {
    @Id
    @Field(type = FieldType.Keyword)
    String isbn;
    @Field(type = FieldType.Text)
    String title;
}

Тогда отображение должно включать что-то вроде

{
  "mappings":
    {
        "book": {
            "properties": {
                "id": {
                    "type": "keyword"
                },
                "title": {
                    "type": "text"
                }
            }
        }
    }
}

Пожалуйста, дайте мне знать, если я думаю об этом неправильно!

Ответы [ 2 ]

1 голос
/ 30 июня 2019

С 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-аннотации - это будет легче контролировать позже.

0 голосов
/ 01 июля 2019

Я не знаю, какую версию Spring Data Elasticsearch вы используете;поддержка использования Jackson Object Mapper вместе с аннотацией @Field ограничена.

Если вы используете 3.2.0RC1, тогда перейдите на ElasticsearchEntityMapper (см. справочные документы как это настроить).Хотя приложение Jackson Mapper по-прежнему используется по умолчанию, если другие не настроены, текущая работа выполняется на ElasticsearchEntityMapper.Я думаю, что после выпуска 3.2 мы, вероятно, изменим преобразователь по умолчанию на ElasticsearchEntityMapper.

Я знаю, что в справочной документации по-прежнему не хватает информации, я просто перерабатываю ее.

При создании индекса с классами Repository из 3.2 учитываются аннотации, такие как @Field, и в индекс записывается правильное отображение, нет необходимости писать это самостоятельно.

...