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

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

1. обзор

В этой статьеwe’ll explore the basics of Spring Data Solr на практике.

Apache Solr - это открытый исходный код, готовый к развертыванию корпоративной системы полнотекстового поиска. Вы можете узнать больше о функциях Solr наofficial website.

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

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

2. Spring Data

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

2.1. Maven Dependency

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


    org.springframework.data
    spring-data-solr
    2.0.5.RELEASE

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

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 и проиндексирован для ядра с именемproduct. Поля, помеченные@Indexed, индексируются в Solr и доступны для поиска.

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

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

public interface ProductRepository extends SolrCrudRepository {

    public List findByName(String name);

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

    @Query(name = "Product.findByNamedQuery")
    public Page 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.example.spring.data.solr.repository",
  namedQueriesLocation = "classpath:solr-named-queries.properties",
  multicoreSupport = true)
@ComponentScan
public class SolrConfig {

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

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

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

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

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

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

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

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

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

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

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

productRepository.delete(retrievedProduct);

4. Запросы

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

4.1. Создание запроса имени метода

Запросы на основе имени метода генерируются путем анализа имени метода, чтобы сгенерировать ожидаемый запрос для выполнения:

public List findByName(String name);

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

List retrievedProducts = productRepository.findByName("Phone");

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

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

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

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

Page result
  = productRepository.findByCustomQuery("Phone", new PageRequest(0, 10));

ВызываяfindByCustomQuery(“Phone”, new PageRequest(0, 10)), мы получаем первую страницу документов продукта, которая содержит слово «Телефон» в любом из полейid илиname.

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

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

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

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

Получим несколько документов с помощью именованного метода запроса:

Page result
  = productRepository.findByNamedQuery("one", new PageRequest(0, 10));

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

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

И, как всегда, используемые здесь примеры доступны какsample project on Github.