Solr vs Hibernate Search - что выбрать и когда? - PullRequest
28 голосов
/ 20 мая 2011

Мы создаем приложение для электронной коммерции.Мы используем стек JAVA с Hibernate и Spring Framework.Как и во всех приложениях для электронной коммерции, нам нужно встроить возможности поиска в наши.

Итак, мы столкнулись с Hibernate Search и Apache Solr .Может кто-нибудь перечислить плюсы и минусы их обоих, чтобы мы могли выбрать идеальное решение для корпоративного поиска?

Ответы [ 6 ]

17 голосов
/ 31 мая 2011

Допустим, вы используете спящий режим для постоянного слоя вашего веб-приложения с конфигурацией на основе аннотаций. Затем вы можете использовать те же классы моделей (как те, что я дал ниже), используемые для аннотации, чтобы установить их индекс на сервере Solr с помощью аннотации, специфичной для сервера Solr.

Я приведу пример, где это делается.

Следующим классом является класс модели клиента без аннотаций Solr.

@Entity
@Table(name="Customer")
public class Customer {

    private int customerId;
    private String customerName;
    private String customerAddress;


    @Id     
    public int getCustomerId() {
        return customerId;
    }
    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }
    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }



}

Теперь давайте добавим аннотации к этому классу с помощью аннотаций Solr для индексации сведений о клиенте в Solr Server.

@Entity
@Table(name="Customer")
public class Customer {
    @Field
    private int customerId;
    @Field
    private String customerName;
    @Field
    private String customerAddress;


    @Id     
    public int getCustomerId() {
        return customerId;
    }
    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }
    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }



}

Просто поместите атрибут @Field для файла, который вы хотите проиндексировать на сервере Solr.

Тогда проблема в том, как сказать solr индексировать эту модель. это можно сделать следующим образом.

Скажем, вы собираетесь сохранить клиента по имени alex в базе данных, затем мы добавим данные в alex следующим образом

Customer alex = new Customer();
alex.setCustomerName("Alex Rod");
alex.setCustomerAddress("101 washington st, DC");

и, после сохранения этого объекта alex в базу данных, вы должны указать solr индексировать этот объект данных. это делается следующим образом.

session.save(alex);

        session.getTransaction().commit();


        String url = "http://localhost:8983/solr";
        SolrServer server = null;
        try {
            server = new CommonsHttpSolrServer(url);
            server.addBean(alex);
            server.commit();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Это все о solr индексации с использованием технологии Hibernate. это довольно просто. Я объяснил вам основную идею о том, как его использовать. я получил этот пример из коммерческого приложения, в котором мы использовали описанный выше метод для реализации функции поиска

15 голосов
/ 15 августа 2012

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

Hibernate-поиск:

Минусы:

  • Требуется комбинация «ведущий / ведомый», которая не всегда возможна, особенно если процесс сборки / развертывания не различает узлы (одинаковая война для всех узлов).
  • Индексы размещаются на том же сервере / процессе, что и приложение, выполняющее Hibernate, поэтому у вас есть один индекс на узел приложения. Это иногда излишне.
  • Это не поиск в реальном времени, если только балансировщик нагрузки не использует сессию.

Плюсы:

  • От нуля до маленькой конфигурации. Просто бросьте банку в путь к классам.
  • Мост между Hibernate и Lucene очень прямой. Просто комментируйте сущности и вуаля!

Solr / SolrCloud:

  • Он не связан с самим приложением.
  • Поиск не в режиме реального времени, а поиск в режиме гибернации.
  • Требуется перезапуск для изменения схемы.
  • SolrCloud - не самый простой в настройке фреймворк.
  • Нет прямого спящего моста Hibernate. Вы должны написать свой собственный слушатель Hibernate и связать его с событиями post- [insert | delete | update] (или найти одно из открытых)

ElasticSearch

  • Серверы не зависят от приложения, как и Solr.
  • Это наиболее простой способ настройки в кластере / облаке.
  • Это в режиме реального времени
  • Также нет прямого спящего моста. (es-hibernate-разъем на GitHub)

Лично я предпочитаю ElasticSearch при работе в облаке.

7 голосов
/ 01 июня 2011

Apache Solr в основном используется для полнотекстового поиска: если вы хотите найти слова (например, единственное и множественное число) в большом наборе документов, где размер каждого документа составляет от одного абзаца до нескольких страниц. Solr может быть не лучше обычной базы данных, если вы не используете ее для текстового поиска, а только для поиска int и varchar.

Эта ссылка может быть полезна для вас:

http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html

5 голосов
/ 05 ноября 2012

Есть еще одна альтернатива, которая использует их вместе и объединяет их плюсы.
Взгляните на: Сочетание возможностей Hibernate Search и Solr
Я использую их вместе, и это прекрасно работает.
Hibernate search предоставляет мне все аннотации и анализ сущностей, а также сбор изменений в границах транзакций, в то время как Solr предоставляет мне лучшую поисковую систему с великолепными функциями, такими как фасеты 1: m, кластеры и т. Д. *

1 голос
/ 02 июня 2011

Поиск в Hibernate - это «мост» между Hibernate и Lucene .Другими словами, он делает постоянные объекты Hibernate автоматически доступными для поиска в индексе Lucene.

Solr - это фреймворк, построенный поверх Lucene (оба проекта должны быть объединены в один день, но это долгий путь).Различия между Solr и Lucene объяснены в другой публикации SO .

1 голос
/ 20 мая 2011

Звучит так, будто вам нужно прочитать все за и против каждого из них.Доступна обширная документация.

Если вы хотите узнать мое мнение, я бы сказал, что имеет смысл использовать Hibernate Search с Hibernate.Обновление поисковых индексов происходит, когда hibernate выполняет операции с базой данных и только когда транзакция базы данных зафиксирована.

...