28

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

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

4

6 に答える 6

17

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

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

次のクラスは、 SolrアノテーションのないCustomerModelクラスです。

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

于 2011-05-31T08:21:27.860 に答える
15

言われたことに加えて、クラスター化された環境にあるとき:

休止状態-検索:

短所:

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

長所:

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

Solr / SolrCloud:

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

ElasticSearch

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

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

于 2012-08-15T04:07:05.993 に答える
7

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

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

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

于 2011-06-01T18:53:16.370 に答える
6

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

于 2012-11-05T14:33:21.500 に答える
1

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

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

于 2011-05-20T16:48:40.443 に答える
1

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

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

于 2011-06-01T22:25:11.097 に答える