私たちはeコマースアプリケーションを構築しています。HibernateとSpringFrameworkでJAVAスタックを使用しています。すべてのeコマースアプリケーションと同様に、検索機能を組み込む必要があります。
そこで、 HibernateSearchとApacheSolrに出くわしました。エンタープライズ検索に最適なソリューションを選択できるように、両方の長所と短所を誰かがリストアップできますか?
私たちはeコマースアプリケーションを構築しています。HibernateとSpringFrameworkでJAVAスタックを使用しています。すべてのeコマースアプリケーションと同様に、検索機能を組み込む必要があります。
そこで、 HibernateSearchとApacheSolrに出くわしました。エンタープライズ検索に最適なソリューションを選択できるように、両方の長所と短所を誰かがリストアップできますか?
アノテーションベースの構成で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インデックス作成に関するものです。それはかなり簡単です。私はあなたにそれを使用する方法の基本的な考えを説明しました。この例は、上記の方法を使用して検索機能を実装した商用アプリケーションから取得しました
言われたことに加えて、クラスター化された環境にあるとき:
休止状態-検索:
短所:
長所:
Solr / SolrCloud:
ElasticSearch
個人的には、クラウドで実行する場合はElasticSearchが好きです。
Apache Solrは、主に全文検索に使用されます。各ドキュメントのサイズが1段落から数ページである大量のドキュメントセットで単語(単数形や複数形など)を検索する場合。Solrをテキスト検索に使用せず、intおよびvarchar検索にのみ使用する場合、Solrは通常のデータベースよりも優れているとは限りません。
このリンクはあなたに役立つかもしれません:
http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html
それらを一緒に使用し、それらの長所を一緒に組み合わせるという別の選択肢があります。
ご覧ください:Hibernate SearchとSolrの機能を組み合わせる
私はそれらを一緒に使用していますが、正常に機能します。
Hibernate検索は、トランザクション境界でのすべてのエンティティの注釈と分析および変更の収集を提供し、Solrは、1:mファセット、クラスターなどの優れた機能を備えた最高の検索エンジンを提供します。
これらのそれぞれの長所と短所を読む必要があるように思えます。利用可能な広範なドキュメントがあります。
私の意見が必要な場合は、HibernateでHibernate検索を使用するのが理にかなっていると思います。検索インデックスの更新は、hibernateがデータベース操作を実行するときに、データベーストランザクションがコミットされたときにのみ発生します。
Hibernate検索は、HibernateとLuceneの間の「架け橋」です。つまり、永続化されたHibernateエンティティをLuceneインデックスで自動的に検索できるようにします。
SolrはLucene上に構築されたフレームワークです(両方のプロジェクトはいつかマージされることになっていますが、それは長い道のりです)。SolrとLuceneの違いは、別のSO投稿で説明されています。