3

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 行目で、「key already present in dictionary」という例外がスローされました。

scopedAnalyzers.Add(scope, analyzer);

ここで、「スコープ」はインデックス フィールドの名前です (ここでは「すべて」)。のようにチェックを入れると

if( !scopedAnalyzers.ContainsKey( scope ) )

それは非常にうまく機能します。各「投稿」ドキュメントに2つのフィールドがあり、1つは本文、もう1つは名前です。しかし、NHibernate.Search のソース コードを変更するのは簡単ではありません。

1 つのフィールドでさまざまなプロパティにインデックスを付ける方法について、誰か提案がありますか?

4

1 に答える 1

2

フィールド属性を使用して必要なものを指定するのに問題がある場合は、独自のドキュメントを作成できるようにするクラス ブリッジを作成できます。

クラス定義で ClassBridgeAttribute を使用し、IFieldBridge インターフェイスを実装する型を指定するだけです。これにより、Lucene ドキュメントのビルド方法を完全に制御できます。

詳細については、http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.htmlを参照してください。4.2.2.3 を参照してください。ClassBridge セクション

于 2010-02-21T05:22:37.103 に答える