【问题标题】:nhibernate.search / lucene.net multi-lingual analysernhibernate.search / lucene.net 多语言分析器
【发布时间】:2012-01-27 13:37:59
【问题描述】:

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

Article
-------
ID
Name

Article_CultureInfo 是:

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

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

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

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

谢谢!

【问题讨论】:

    标签: c# lucene.net multilingual nhibernate.search


    【解决方案1】:

    我基本上已经为这种方法做了一个变通方法 - 有点矫枉过正但有效。

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

    这个IGetter 的作用是:当在它上面调用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");
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2011-01-22
      • 2014-03-16
      相关资源
      最近更新 更多