2012-01-27 14 views
0

NHibernate.Searchを多言語ウェブサイトに統合しようとしています。現在、このウェブサイトには多言語対応のクラスArticleが含まれています。これは、言語固有のコンテンツを格納する別のクラス(Article_CultureInfo)を持つことによって行われます。私は、フィールド/文書情報をマップするためにNhibernate.Search.Mappingを使用していますnhibernate.search/lucene.net多言語アナライザ

Article_CultureInfo 
------- 
ID 
ArticleId 
CultureCode 
PageTitle 
Content 

Articleのフィールドは

Article 
------- 
ID 
Name 

そしてArticle_CultureInfoがあります。可能な場合は、言語に基づいて、ステミングや同義語解析などの検索機能を組み込みたいと考えています。 Lucene Analyzerは、コンパイル時/初期化時ではなく、実行時に指定できる方法はありますか?

それぞれのLuceneインデックスに格納されるPageTitleのコンテンツを分析しているとします。このコンテンツは、CultureCodeの値に基づいて英語、フランス語、イタリア語などです。したがって、この値に基づいてアナライザを変更する必要があります。私はカスタムMultilingualAnalyserを実装しようとしましたが、利用可能なデータは解析する文字列、つまりPageTitleの値だけです。それだけで、私はその言語を推論することはできません。 (私は言語検出テクニックを調べることができましたが、それは何かを既に分かっており、100%信頼できるものではありません)。

もし私がトークンから離れていたら、オブジェクトのインスタンスでは、私はCultureCodeの値を取得し、それに応じて分析することができます。どんなアイデアも大歓迎です。NHibernate.Searchは非常にうまく統合されているので、Lucene.Netを直接使用しないでください。

ありがとうございます!

答えて

0

私は基本的にこの方法の回避策をとってきました。かなり残念ですが動作します。

MultilingualGetterという多言語プロパティに使用されるIGetterの新しい実装を作成しました。これは基本的にBasicGetterと同じですが、何らかの理由でそれを拡張できませんでした。sealedなので、コードをコピーしました。

これは何ですか:Get()メソッドが呼び出されると、targetオブジェクトが与えられます。これはプロパティを含むクラスのインスタンスです。私は、作成した多言語オブジェクト用のインターフェイスを実装していることを確認します。IMultilingualContentInfo。その後、IMultilingualContentInfoから現在のカルチャを取得し、実際のテキストの先頭に追加します(例:[en] Hello World!)。

このテキストは、作成したカスタムアナライザに渡されます。このアナライザは、カルチャーを解析して、それが何であるかを推測することもできます。その後、その言語に基づいてテキストを切り取るためにSnowballFilterを使用しています。

以下

カスタムIGetter実装のGet()メソッドのコードです - IMultilingualContentInfo

/// <summary> 
    /// Gets the value of the Property from the object. 
    /// </summary> 
    /// <param name="target">The object to get the Property value from.</param> 
    /// <returns> 
    /// The value of the Property for the target. 
    /// </returns> 
    public object Get(object target) 
    { 

     if (target is IMultilingualContentInfo) 
     { 
      try 
      { 
       IMultilingualContentInfo multiLingualTarget = (IMultilingualContentInfo)target; 
       string s = (string)property.GetValue(target, new object[0]); 
       if (!string.IsNullOrWhiteSpace(s)) 
       { 
        MultilingualLuceneTextContent mlText = new MultilingualLuceneTextContent(); 
        mlText.Culture = multiLingualTarget.CultureInfo.GetCultureCode(); 
        s = mlText.GetTextIncCulture(); 

       } 
       return s; 
      } 
      catch (Exception e) 
      { 
       throw new PropertyAccessException(e, "Exception occurred", false, clazz, propertyName); 
      } 
     } 
     else 
     { 
      throw new InvalidOperationException("Multilingual Getter is only available on IMultilingualContentInfo objects"); 
     } 

    }