web-dev-qa-db-ja.com

Solr vs Hibernate Search-どちらをいつ選択するか?

私たちはeコマースアプリケーションを構築しています。 JavaスタックとHibernateおよびSpringFrameworkを使用しています。すべてのeコマースアプリケーションと同様に、検索機能を組み込む必要があります。

それで、 Hibernate SearchApache Solr に出くわしました。エンタープライズ検索に最適なソリューションを選択できるように、両方の長所と短所を誰かがリストアップできますか?

28
Lucky Murari

Apache Solrは、主に全文検索に使用されます。各ドキュメントのサイズが1段落から数ページの大きなドキュメントセットで単語(単数形や複数形など)を検索する場合。 Solrをテキスト検索に使用せず、intおよびvarchar検索にのみ使用する場合、Solrは通常のデータベースよりも優れているとは限りません。

このリンクはあなたに役立つかもしれません:

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

7
Bob Yoplait

アノテーションベースの構成でWebアプリケーションの永続レイヤーに休止状態を使用しているとします。次に、アノテーションに使用したものと同じモデルクラス(以下に示すものなど)を使用して、Solrサーバー固有のアノテーションを使用してSolrサーバーにインデックスを設定できます。

これが行われる場所の例を示します。

次のクラスはCustomerModelクラスですなし 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サーバーの顧客の詳細にインデックスを付けましょう。

@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;
    }



}

Solrサーバーでインデックスを作成するファイルの@Field属性を配置するだけです。

次に、問題は、このモデルにインデックスを付けるように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();
        }

これはすべて、Hibernateテクノロジーを使用したSolrインデックス作成に関するものです。それはかなり簡単です。私はあなたにそれを使用する方法の基本的な考えを説明しました。この例は、上記の方法を使用して検索機能を実装した商用アプリケーションから取得しました

17
KItis

言われていることに加えて、クラスター環境では:

Hibernate-検索:

短所:

  • 特にビルド/デプロイメントプロセスがノードを区別しない場合(すべてのノードで同じ戦争)、常に実行可能であるとは限らないマスター/スレーブの組み合わせが必要です。
  • インデックスは、Hibernateを実行しているアプリケーションと同じサーバー/プロセスでホストされるため、アプリケーションノードごとに1つのインデックスがあります。これは時々やり過ぎです。
  • ロードバランサーがセッションスティッキネスを使用しない限り、これはリアルタイム検索ではありません。

長所:

  • ゼロから小さな構成。 jarをクラスパスにドロップするだけです。
  • HibernateとLuceneの間の橋渡しは非常に簡単です。エンティティとボイラーに注釈を付けるだけです!

Solr/SolrCloud:

  • それ自体がアプリケーションから切り離されています。
  • Hibernate-searchのように、リアルタイム検索ではありません。
  • スキーマを変更するには再起動が必要です。
  • SolrCloudは、構成が最も簡単なフレームワークではありません。
  • まっすぐ進むHibernateブリッジはありません。独自のHibernateリスナーをコーディングし、それらをpost- [挿入|削除|更新]イベントにバインドする必要があります(またはオープンソースのリスナーを見つける)

ElasticSearch

  • サーバーは、solrと同様に、アプリケーションから独立しています。
  • クラスター/クラウドで構成するのがはるかに簡単です。
  • リアルタイム
  • まっすぐ進むHibernateブリッジもありません。 (GitHubのes-hibernate-connector)

個人的には、クラウドで実行する場合はElasticSearchを好みます。

15

それらを一緒に使用し、それらの長所を一緒に組み合わせるという別の選択肢があります。
以下をご覧ください: Hibernate SearchとSolrの機能の組み合わせ
私はそれらを一緒に使用していますが、正常に動作します。
Hibernate検索は、すべてのエンティティの注釈と分析を提供し、トランザクション境界のコレクションを変更します。Solrは、1:mファセット、クラスターなどの優れた機能を備えた最高の検索エンジンを提供します。

5
Avner Levy

あなたこれらのそれぞれの長所と短所を読む必要があるように聞こえます。利用可能な広範なドキュメントがあります。

私の意見が必要な場合は、HibernateでHibernateSearchを使用するのが理にかなっていると思います。検索インデックスの更新は、hibernateがデータベース操作を実行するときに、データベーストランザクションがコミットされたときにのみ発生します。

1
Alex Barnes

Hibernate検索は、Hibernateと Lucene の間の「ブリッジ」です。つまり、永続化されたHibernateエンティティをLuceneインデックスで自動的に検索できるようにします。

SolrはLucene上に構築されたフレームワークです(両方のプロジェクトはいつかマージされることになっていますが、それは長い道のりです)。 SolrとLuceneの違いは another SO post

1
mindas