2012-01-27 2 views
0

NHibernate.Search를 다국어 웹 사이트에 통합하려고합니다. 이제이 웹 사이트에는 다국어 인 Article 클래스가 있습니다. 이 작업은 언어 별 콘텐츠를 저장하는 별도의 클래스 인 Article_CultureInfo을 사용하여 수행됩니다. I 필드/문서 정보를 매핑하는 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이므로 코드를 복사했습니다.

이 내용 IGetter은 다음과 같습니다. Get() 메서드가 호출 될 때 target 개체가 지정됩니다. 이 속성을 포함하는 클래스의 인스턴스입니다. 내가 만든 다국어 개체 인 IMultilingualContentInfo에 대한 인터페이스를 구현하는지 확인합니다. 그런 다음 IMultilingualContentInfo에서 현재 문화권을 검색하고이를 실제 텍스트 앞에 추가합니다 (예 : [en] Hello World!).

이 텍스트는 내가 작성한 사용자 정의 분석기로 전달되며,이 분석기는 문화를 분석하여 그것이 무엇인지 추론 할 수 있습니다. 그런 다음 언어를 기반으로 텍스트를 줄이기 위해 SnowballFilter을 사용합니다. 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"); 
     } 

    } 
- 아래

사용자 정의 IGetter 구현의 Get() 메서드에 대한 코드입니다