0

我正在尝试将 NHibernate.Search 集成到多语言网站中。现在,这个网站包含一个Article多语言类。这是通过有一个单独的类来完成的——Article_CultureInfo它存储特定于语言的内容。的领域Article

Article
-------
ID
Name

并且Article_CultureInfo是:

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

Nhibernate.Search.Mapping用来绘制字段/文档信息。我想根据语言在可能的情况下合并搜索功能,例如词干分析和同义词分析。有什么方法可以在运行时指定 Lucene Analyzer,而不是编译时/初始化?

假设我们正在分析PageTitle要存储在相应 Lucene 索引中的内容 - 根据 的值,该内容可以是英语、法语、意大利语等CultureCode。因此,分析仪应根据此值进行更改。我已经尝试实现自定义MultilingualAnalyser,但是我唯一可用的数据是要分析的字符串,即PageTitle. 仅凭此,我无法推断出语言。(我可以研究语言检测技术,但这超出了范围,因为我已经具体知道它是什么,而且会过度杀伤并且不是 100% 可靠。)

如果我除了令牌之外还有一个对象的实例,我可以从中获取CultureCode价值,并进行相应的分析。任何想法都将不胜感激 - 我真的希望避免直接使用 Lucene.Net,因为 NHibernate.Search 看起来可以很好地集成。

谢谢!

4

1 回答 1

0

我基本上已经为这种方法做了一个解决方法 - 相当过分但有效。

我创建了一个新的实现IGetter,用于多语言属性,我称之为MultilingualGetter. 这基本上与BasicGetter- 由于某种原因我无法从它扩展sealed,所以我复制了代码。

IGetter的作用是:当Get()调用它的方法时,它被赋予target对象。这是包含该属性的类的实例。我检查它是否为我创建的多语言对象实现了一个接口,IMultilingualContentInfo. 然后它从 中检索当前文化IMultilingualContentInfo,并将其附加到实际文本的前面,例如 [en]Hello World!。

然后将此文本传递给我创建的自定义分析器,该分析器也解析文化,并可以推断出它是什么。SnowballFilter然后它根据语言使用 a来阻止文本。

以下是Get()自定义IGetter实现方法的代码 -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");
        }

    }
于 2012-01-31T15:19:57.277 回答