Рубрики
Без рубрики

Введение в весенние данные Elasticsearch

В этой статье мы исследуем основы Spring Data Elasticsearch и показываем, как индексировать, искать и запрашивать данные с помощью фреймворка.

Автор оригинала: baeldung.

1. Обзор

В этом учебнике Мы изумим основы весенних данных Elasticsearch в соответствии с кодексом и практическим образом.

Мы покажем, как индексировать, искать и запрашивать Elasticsearch в приложении Spring с помощью Spring Data Elasticsearch. Spring Data Elasticseach — это модуль Spring, который реализует Spring Data, предлагая способ взаимодействия с популярной поисковой системой с открытым исходным кодом Lucene.

В то время как Elasticsearch может работать без трудно определенной схемы, это обычная практика, чтобы разработать один и создать отображения с указанием типа данных, которые следует ожидать в определенных областях . При индексации документа его поля обрабатываются в соответствии с их типами. Например, текстовое поле будет токенизировано и отфильтровировано в соответствии с правилами отображения. Мы также могли бы создавать собственные фильтры и токенизаторы.

Для простоты мы будем использовать изображение докера для нашего экземпляра Elasticsearch, хотя и любой Elasticsearch экземпляр прослушивания на порт 9200 будет делать .

Начнем с запуска нашего Elasticsearch экземпляр:

docker run -d --name es762 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.2

2. Весенние данные

Весенние данные помогают избежать шаблонного кода. Например, если мы определяем интерфейс репозитория, который расширяет УпругиепоискаПоместные интерфейс, предоставленный Spring Data Elasticsearch , Операции CRUD для соответствующего класса документов будут доступны по умолчанию.

Кроме того, просто объявив методы с именами в заранее определенном формате, для нас генерируются реализации метода – нет необходимости писать реализацию интерфейса репозитория.

Baeldung руководства по весенним данным обеспечить необходимое, чтобы начать работу по этой теме.

2.1. Зависимость от Maven

Spring Data Elasticsearch предоставляет Java API для поисковой системы. Для того, чтобы использовать его, мы должны добавить новую зависимость к пом.xml :


    org.springframework.data
    spring-data-elasticsearch
    4.0.0.RELEASE

2.2. Определение интерфейсов репозитория

Для определения новых репозиториев мы расширяем один из предоставленных интерфейсов репозитория, заменяя общие типы нашими фактическими типами документов и основных ключей.

Важно отметить, что УпругиепоискаПоместные простирается от PagingAndSortingRepository. Это позволяет встроенную поддержку pagination и сортировки.

В нашем примере мы будем использовать функцию paging в наших пользовательских методах поиска:

public interface ArticleRepository extends ElasticsearchRepository {

    Page
findByAuthorsName(String name, Pageable pageable); @Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}") Page
findByAuthorsNameUsingCustomQuery(String name, Pageable pageable); }

С findByAuthorsИмя метод, прокси репозиторий создаст реализацию на основе имени метода. Алгоритм разрешения определит, что он должен получить доступ к авторы собственности, а затем имя свойство каждого элемента.

Второй метод, findByAuthorsNameUsingCustom- , использует пользовательский запрос Elasticsearch boolean, определяемый с помощью @Query аннотация, которая требует строгого сопоставления между именем автора и предоставленным имя аргумент.

2.3. Конфигурация Java

При настройке Elasticsearch в нашем Java-приложении нам необходимо определить, как мы подключаемся к экземпляру Elasticsearch. Для этого мы используем RestHighLevelClient которая предлагается зависимостью Elasticsearch:

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository")
@ComponentScan(basePackages = { "com.baeldung.spring.data.es.service" })
public class Config {

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration 
            = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }
}

Мы используем стандартную аннотацию стиля Spring. @EnableElasticsearchRepositories сделает Spring Data Elasticsearch сканировать предоставленный пакет для хранилищ весенних данных.

Для связи с нашим сервером Elasticsearch мы используем простую RestHighLevelClient . В то время как Elasticsearch предоставляет несколько типов клиентов, используя RestHighLevelClient является хорошим способом для будущего доказательство связи с сервером.

Наконец, мы создали Упругие исследованияОперации боб для выполнения операций на нашем сервере. В этом случае мы мгновенно Упругий поискРестТемплет .

3. Отображение карт

Карты используются для определения схемы для наших документов. Определяя схему наших документов, мы защищаем их от нежелательных результатов, таких как отображение типа, который мы не хотели бы.

Наша сущность представляет ею простой документ под названием Статья где id типа Струнные . Мы также уточняем, что такие документы должны храниться в индексе под названием блог в пределах статья тип.

@Document(indexName = "blog", type = "article")
public class Article {

    @Id
    private String id;
    
    private String title;
    
    @Field(type = FieldType.Nested, includeInParent = true)
    private List authors;
    
    // standard getters and setters
}

Индексы могут иметь несколько типов. Мы можем использовать эту функцию для реализации иерархий.

авторы поле помечено как FieldType.Nested . Это позволяет нам определить Автор отдельно, но имеют отдельные экземпляры автора, встроенные в Статья документ, когда он индексирован в Elasticsearch.

4. Документы об индексации

Spring Data Elasticsearch обычно автоматически создает индексы, основанные на сущностях проекта. Тем не менее, мы также можем создать индекс программно через шаблон клиента:

elasticsearchTemplate.indexOps(Article.class).create();

Затем можно добавить документы в индекс:

Article article = new Article("Spring Data Elasticsearch");
article.setAuthors(asList(new Author("John Smith"), new Author("John Doe")));
articleRepository.save(article);

5. Запросы

5.1. Запрос на основе названия метода

Когда мы используем запрос на основе имени метода, мы пишем методы, определяющие запрос, который мы хотим выполнить. Во время настройки Spring Data анализирует подпись метода и создает соответствующие запросы:

String nameToFind = "John Smith";
Page
articleByAuthorName = articleRepository.findByAuthorsName(nameToFind, PageRequest.of(0, 10));

Позвонив findByAuthorsИмя с PageRequest объект, мы получаем первую страницу результатов (страница с номером равна нулю), с этой страницей, содержащей не более 10 статей. Объект страницы также предоставляет общее количество просмотров запроса наряду с другой удобной информацией о pagination.

5.2. Пользовательский запрос

Существует несколько способов определения пользовательских запросов для репозиториев Spring Data Elasticsearch. Один из способов заключается в использовании @Query аннотация, как попродемонстрировано в разделе 2.2.

Другой вариант заключается в использовании строитель запроса для создания нашего пользовательского запроса.

Имея для поиска статей, которые имеют слово ” данные ” в названии, мы могли бы просто создать РоднойПоискУердостроитель с фильтром на титул:

Query searchQuery = new NativeSearchQueryBuilder()
   .withFilter(regexpQuery("title", ".*data.*"))
   .build();
SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog");

6. Обновление и удаление

Для обновления документа необходимо сначала получить его:

String articleTitle = "Spring Data Elasticsearch";
Query searchQuery = new NativeSearchQueryBuilder()
  .withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%"))
  .build();

SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog"); Article article = articles.getSearchHit(0).getContent();

Затем мы можем внести изменения в документ, просто редактируя содержимое объекта с помощью его оценщиков:

article.setTitle("Getting started with Search Engines");
articleRepository.save(article);

Что касается удаления, есть несколько вариантов. Мы можем получить документ и удалить его с помощью удалить метод:

articleRepository.delete(article);

Мы также можем удалить его id когда это известно:

articleRepository.deleteById("article_id");

Также можно создавать пользовательские удалить запросы и использовать функцию массового удаления, предлагаемую Elasticsearch:

articleRepository.deleteByTitle("title");

7. Заключение

В этом учебнике мы исследовали, как подключиться и использовать Spring Data Elasticsearch. Мы обсудили, как мы можем запрашивать, обновлять и удалять документы. Кроме того, мы также обсудили, как создавать пользовательские запросы, и они не соответствуют тому, что предлагает Spring Data Elasticsearch.

Как обычно, исходный код, используемый на протяжении всего этого учебника можно найти более на GitHub .