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