Solr vs Hibernate Search - что выбрать и когда?

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Следующий класс - это модель модельного класса Customer без 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. это довольно просто вперед. Я объяснил вам основную идею о том, как его использовать. Я получил этот пример из коммерческого приложения, где мы использовали вышеописанный метод для реализации функций поиска

Ответ 3

В дополнение к тому, что было сказано, когда в кластерной среде:

Hibernate-поиска:

Минусы:

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

Плюсы:

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

Solr/SolrCloud:

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

ElasticSearch

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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