Spring、Hibernate、 Hibernate Search 、および JSFに基づいた、あなたのようなユースケースをカバーするこの記事をご覧ください。包括的で十分に文書化されたサンプル アプリケーションが付属しています。
これは、懸念パラダイムとモジュール性の分離に焦点を当てています。したがって、全文検索に関する概念は、Grails やその他の Java ベースのアプリケーションにうまく適合するはずです。
主なドメイン クラスはde.metagear.library.model.Media
(関連するMetaData
ドメイン クラスもあります) です。Hibernate クラスと GORM クラスを混在させることができます。ただし、その場合は別の API を使用する必要があります。
Media
クラスには次のプロパティが含まれますplainText
。
@Column(name = "plain_text", nullable = false)
@Field(index = Index.TOKENIZED, store = Store.YES)
@Lob
private String plainText;
そのプロパティは、抽出されたテキスト (つまり、PDF などから) を保持します。データベースに保存する必要があるかどうかはわかりません (おそらくそうではありませんが、それほど害はありません)。ただし、全文検索には使用されません(以下を参照)。全文検索では、Lucene インデックスのみが使用されます。
が作成される前Media
に、対応する元のドキュメント (場合によってはバイナリ ドキュメント) のテキスト コンテンツが抽出されます。このde.metagear.library.model.factory.MediaFactory.getInstance(..)
メソッドはテキストを抽出し、抽出したテキストを新しいMedia
オブジェクトに保存して、それを返しますMedia
。
サンプルでは、元のドキュメントをドメイン オブジェクトのプロパティに格納するだけですが、その場所でドキュメントをファイルに保存し、参照 (前述の GUID) をMedia
のプロパティに格納することもできます。
ドメイン クラスは、Spring Bean であるクラスによって保存されます。内部的には、内部でHibernate を使用するように/applicationContext.xmlde.metagear.library.dao.MediaCrudDaoImpl
で定義されている注入されたものを使用しています。EntityManagerFactory
ドメイン クラスの Hibernate アノテーションにより、インデックス作成が自動的に行われます。
全文検索自体の実行に関しては、データベースにクエリを実行せず、Lucene インデックスのみにクエリを実行する方法によって実行de.metagear.library.dao.MediaSearchDaoImpl.getSearchResults(..)
されます。
サンプル アプリケーションには、包括的なLucene 式構文を保持しながら、さまざまなインデックスで AND、OR、および NOT 演算子を組み合わせることができる強力なクエリ用語プリプロセッサが含まれています。
この場所でカスタムorg.hibernate.transform.ResultTransformer
を設定することにより、任意のタイプのオブジェクト (もちろんドメイン クラスを含む) を返すことができます。
私はまだ Grails Searchable プラグインを調べていないので、堅牢性、保守性、使いやすさ、そして何よりもカスタムまたはサードパーティのコンテンツ エクストラクタによる拡張性の点で実行可能かどうかはわかりません。 、パーサー、およびアナライザー。おそらく、それもそうです。
結局のところ、Spring と (おそらく) Hibernate フレームワークの基本的な知識が私のアプローチに関係しています。これらは Grails と Gorm が基づいているフレームワークにすぎませんが、これが決定点になると思います。
少なくとも、上記の概念を見ることは有益であり、さまざまなフレームワークやアプローチを見るときに前進する力を与えるはずです.
ありがとう。