1

メタデータと物理ファイルへのパスをデータベースに保存するデジタル ライブラリ システムがあります。ファイルは何でもかまいません: プレーンテキスト、Word、PDF、MP3、JPEG、MP4...

ドメイン オブジェクトと物理ファイル (またはファイルのテキスト抽出) の両方に全文検索を提供するにはどうすればよいですか。

ドキュメント テキストをドメイン オブジェクトに格納する唯一の選択肢はありますか? 検索結果がドメイン オブジェクトからのものか、物理的なドキュメントからのものかに関係なく、ドメイン オブジェクトのリストを取得できる必要があります。もちろん、ファイル パスを使用して接続することもできます。実際に各ドキュメントを GUID で指定されたフォルダーにドロップすることで、接続が確立されます。

理想的にはsolrまたは検索可能なプラグインを使用してGrailsでこれを行う必要がありますが、Javaソリューションが役立ちます。

4

2 に答える 2

0

コンテンツをドメイン オブジェクトに保存する必要はありません。インデックス エントリの作成時にコンテンツをドメイン オブジェクトに関連付けるだけです。Apache POIを使用してコンテンツを抽出しましたが、 Apache Tikaなどのより高度なサービスがあります。

Luceneを直接使用して Java でコーディングすることもできますが、代わりにSOLRをお勧めします

Luceneに基づくCompassに基づくgrails 検索可能なプラグイン

于 2010-10-23T15:26:05.393 に答える
0

SpringHibernate、 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 が基づいているフレームワークにすぎませんが、これが決定点になると思います。

少なくとも、上記の概念を見ることは有益であり、さまざまなフレームワークやアプローチを見るときに前進する力を与えるはずです.

ありがとう。

于 2010-11-04T21:58:41.817 に答える