Статьи

Solr, как модуль данных Spring

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

В этом случае мне хорошо известно, что уровень абстракции над Solr не означает, что мы можем легко изменить базовое хранилище данных: Solr спроектирован как инвертированный индекс, тогда как другие модули Spring Data гораздо более специализированы (JPA, MongoDB и т. Д.). .). Тем не менее, есть некоторые преимущества использования Spring Data по сравнению с Solr:

  • Быстрое прототипирование, когда вам не нужны целые девять ярдов
  • Используйте Solr, когда большая часть команды уже знает о Spring Data, а не Solr
  • Пружина интеграции снизу
  • Наконец, что не менее важно, вы можете легко переключаться между встроенным Solr и автономным. Spring Data прекрасно оборачивает как API-интерфейс Solrj, так и HTTP за собственный API. Если вы считаете, что это не уместный вариант использования, поскольку этого никогда не произойдет, подумайте об интеграционном тестировании

После инициализации Solr с соответствующими данными, вот шаги, которые вы должны пройти, чтобы начать разработку:

  1. Первым шагом является настройка контекста Spring с базовым Solr. Spring Data Solr требует bean-компонента с именем solrTemplatetype SolrOperations. Давайте использовать JavaConfig для этого:
    @Configuration
    @EnableSolrRepositories("ch.frankel.blog.springdata.solr.repository")
    public class JavaConfig {
        @Bean
        protected HttpSolrServerFactoryBean solrServerFactory() {
     
            HttpSolrServerFactoryBean factory = new HttpSolrServerFactoryBean();
     
            factory.setUrl("http://localhost:8983/solr");
     
            return factory;
        }
     
        @Bean
        public SolrOperations solrTemplate() throws Exception {
     
            return new SolrTemplate(solrServerFactory().getObject());
        }
    }
  2. Создайте управляемый объект. Все поля, хранящиеся в Solr, должны быть помечены @Field. Если имя атрибута сущности отличается от имени поля Solr, @Fieldпринимает значение для переопределения имени:
    public class Loan {
        @Field
        private String id;
     
        @Field("gov_type")
        private String governmentType;
     
        // Getters and setters
    }
  3. Создайте интерфейс репозитория: либо наследуйте от, SolrRepository<Bean,ID>либо SolrCrudRepository<Bean,ID>. Обратите внимание, что первый предоставляет только count()метод.
    public interface LoanRepository extends SolrRepository<Loan, String> {}
  4. Добавьте методы запросов к прежнему интерфейсу:
  • Простые методы запроса выгоды от Spring разборе данных: List<Loan> findByLoanType(String)переведет?q=loan_type:...
  • Более сложные запросы (или метод, чье имя не соответствует шаблону) должны быть аннотированы @Query@Query("state_name:[* TO *]")найдут все кредиты, для которых есть значение state_name. Аннотация может связать столько параметров, сколько необходимо, с помощью ?xгде x — это индекс параметра в списке параметров метода.
  • Фасеты также обрабатываются с помощью @Facetаннотации, которая принимает имена полей, которые должен использовать фасет. Тем не менее, это меняет сигнатуру метода на a, FacetPageи это зависит от вызывающего метода (возможно, расположенного на уровне службы), чтобы справиться с этим.

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

public interface LoanRepository extends SolrRepository<Loan, String> {
 
    List<Loan> findByLoanType(String loan);
 
    List<Loan> findByTitleContaining(String title);
 
    @Query("state_name:[* TO *]")
    List<Loan> findLocalized();
 
    @Query("*:*")
    @Facet(fields = "loan_type")
    FacetPage<Loan> findAllLoanTypes(Pageable page);
}

Весь исходный код проекта доступен здесь в формате IntelliJ / Maven, в комплекте с тестами. Обратите внимание, что вам понадобится работающий экземпляр Solr с определенной схемой Solr и документами в ней. Предоставляются как схема, так и файлы документов (fede.xml), но они не автоматизированы: вам нужно перезаписать вашу схему и файл документа в работающий экземпляр (с помощью классической java -jar post.jarкомандной строки).

Чтобы идти дальше: