Перейти к основному содержимому

Введение в Spring Data Solr

· 5 мин. чтения

1. Обзор

В этой статье мы рассмотрим основы Spring Data Solr на практике.

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

Мы покажем, как выполнить простую настройку Solr и, конечно же, как взаимодействовать с сервером.

Во-первых, нам нужно запустить сервер Solr и создать ядро для хранения данных (которое по умолчанию Solr создаст в режиме без схемы).

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

Как и любой другой проект Spring Data, перед Spring Data Solr стоит четкая цель — удалить шаблонные коды, чем мы обязательно воспользуемся.

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

Начнем с добавления зависимости Spring Data Solr к нашему pom.xml :

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>4.3.14</version>
</dependency>

Вы можете найти последние зависимости здесь .

2.2. Определение документа

Давайте определим документ под названием Product :

@SolrDocument(solrCoreName = "product")
public class Product {

@Id
@Indexed(name = "id", type = "string")
private String id;

@Indexed(name = "name", type = "string")
private String name;

}

Аннотация @SolrDocument указывает, что класс Product является документом Solr и проиндексирован для основного именованного продукта . Поля, аннотированные @Indexed , индексируются в Solr и будут доступны для поиска.

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

Далее нам нужно создать интерфейс репозитория, расширив репозиторий, предоставленный Spring Data Solr. Мы, естественно, параметризуем это с помощью Product и String в качестве идентификатора нашего объекта:

public interface ProductRepository extends SolrCrudRepository<Product, String> {

public List<Product> findByName(String name);

@Query("id:*?0* OR name:*?0*")
public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);

@Query(name = "Product.findByNamedQuery")
public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);

}

Обратите внимание, что здесь мы определяем три метода поверх API, предоставляемого SolrCrudRepository . Мы поговорим об этом в следующих нескольких разделах.

Также обратите внимание, что свойство Product.findByNamedQuery определено в файле именованного запроса Solr solr-named-queries.properties в папке classpath:

Product.findByNamedQuery=id:*?0* OR name:*?0*

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

Теперь мы рассмотрим конфигурацию Spring слоя сохраняемости Solr:

@Configuration
@EnableSolrRepositories(
basePackages = "com.foreach.spring.data.solr.repository",
namedQueriesLocation = "classpath:solr-named-queries.properties")
@ComponentScan
public class SolrConfig {

@Bean
public SolrClient solrClient() {
return new HttpSolrClient.Builder("http://localhost:8983/solr").build();
}

@Bean
public SolrTemplate solrTemplate(SolrClient client) throws Exception {
return new SolrTemplate(client);
}
}

Мы используем @EnableSolrRepositories для сканирования пакетов на наличие репозиториев. Обратите внимание, что мы указали расположение именованного файла свойств запроса и включили многоядерную поддержку.

Если многоядерность не включена, то по умолчанию Spring Data будет считать, что конфигурация Solr предназначена для одного ядра. Мы включаем многоядерность здесь, просто для справки.

3. Spring Data Solr с Spring Boot

В этом разделе мы рассмотрим, как выглядит настройка в приложении Spring Boot.

Начнем с добавления зависимости Spring Boot Starter Data Solr к нашему pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.12</version>
</dependency>

Вы можете найти последнюю версию зависимости здесь .

Мы также должны определить свойство spring.data.solr.host в файле application.properties со значением Solr URL:

spring.data.solr.host=http://localhost:8983/solr 

Убедитесь, что Solr работает по указанному URL-адресу.

Это вся конфигурация, которая нам нужна для настройки Spring Data Solr в приложении Spring Boot, поскольку наличие стартера в пути к классам загрузит автоконфигурацию.

4. Индексирование, обновление и удаление

Для поиска документов в Solr документы должны быть проиндексированы в репозиторий Solr.

В следующем примере документ продукта в репозитории Solr индексируется просто с помощью метода сохранения SolrCrudRepository :

Product phone = new Product();
phone.setId("P0001");
phone.setName("Phone");
productRepository.save(phone);

Теперь давайте извлечем и обновим документ:

Product retrievedProduct = productRepository.findById("P0001").get();
retrievedProduct.setName("Smart Phone");
productRepository.save(retrievedProduct);

Документы можно удалить, просто вызвав метод удаления:

productRepository.delete(retrievedProduct);

5. Запрос

Давайте теперь рассмотрим различные методы запросов, предоставляемые API Spring Data Solr.

5.1. Генерация запроса имени метода

Запросы на основе имени метода генерируются путем анализа имени метода для генерации ожидаемого запроса для выполнения:

public List<Product> findByName(String name);

В нашем интерфейсе репозитория у нас есть метод findByName , который генерирует запрос на основе имени метода:

List<Product> retrievedProducts = productRepository.findByName("Phone");

5.2. Запрос с аннотацией @Query

Поисковые запросы Solr можно создать, указав запрос в аннотации метода @Query . В нашем примере findByCustomQuery снабжен аннотацией @Query :

@Query("id:*?0* OR name:*?0*")
public Page<Product> findByCustomQuery(String searchTerm, Pageable pageable);

Давайте используем этот метод для получения документов:

Page<Product> result 
= productRepository.findByCustomQuery("Phone", PageRequest.of(0, 10));

Вызывая findByCustomQuery("Phone", PageRequest.of(0, 10)) мы получаем первую страницу документов продукта, которая содержит слово "Phone" в любом из своих полей id или name .

5.3. Именованный запрос

Именованные запросы аналогичны запросам с аннотацией @Query, за исключением того, что запросы объявляются в отдельном файле свойств:

@Query(name = "Product.findByNamedQuery")
public Page<Product> findByNamedQuery(String searchTerm, Pageable pageable);

Обратите внимание, что аннотация @Query не требуется, если ключ ( findByNamedQuery ) запроса в файле свойств совпадает с именем метода.

Давайте получим некоторые документы, используя именованный метод запроса:

Page<Product> result 
= productRepository.findByNamedQuery("one", PageRequest.of(0, 10));

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

Эта статья представляет собой быстрое и практическое введение в Spring Data Solr, охватывающее базовую настройку, определение репозиториев и, естественно, запросы.

И, как всегда, используемые здесь примеры доступны в качестве образца проекта на Github .