(N)Hibernate.Search :1 つのフィールド内の異なるプロパティにインデックスを付ける
-
20-09-2019 - |
質問
Lucene を使用してエンティティのインデックスを作成していたとき、インデックス付けされたすべてのプロパティを「all」という名前のフィールドに入れて、エンティティ タイプの「すべて」に対して検索を実行する習慣がありました。
現在、NHibernate.Search を使用していますが、これを行う方法が見つかりません。私はこれを試しました:
[Indexed(Index = "MyIndex")]
public class Post
{
[DocumentId]
public virtual int Id { get; set; }
[IndexedEmbedded]
public virtual Author Author { get; set; }
[IndexedEmbedded]
public virtual IEnumerable<Category> Categories { get; set; }
[Field(Index.Tokenized, Store = Store.Yes)]
[Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
public virtual string Name { get; set; }
[Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
[Field(Index.Tokenized, Store = Store.Yes)]
public virtual string Body { get; set; }
}
しかし、例外がスローされました:「キーはすでに辞書に存在します」、ScopedAnalyzer.cs の 26 行目:
scopedAnalyzers.Add(scope, analyzer);
ここで、「scope」はインデックス フィールドの名前です (ここでは「All」)。のようなチェックを入れると
if( !scopedAnalyzers.ContainsKey( scope ) )
それは非常にうまく機能します:「投稿」ドキュメントごとに 2 つのフィールドがあり、1 つは本文、もう 1 つは名前です。ただし、NHibernate.Search のソース コードを変更するのは簡単ではありません。
1 つのフィールドでさまざまなプロパティにインデックスを付ける方法について提案を受けた人はいますか?
解決
Field 属性を使用して必要なものを指定するのに問題がある場合は、独自のドキュメントを作成できるクラス ブリッジを作成できます。
クラス定義で ClassBridgeAttribute を使用し、IFieldBridge インターフェイスを実装する型を指定するだけです。これにより、Lucene ドキュメントの構築方法を完全に制御できるようになります。
詳細については、次のサイトを参照してください。 http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html 4.2.2.3を参照してください。クラスブリッジセクション