繁体   English   中英

nhibernate.search / lucene.net多语言分析仪

[英]nhibernate.search / lucene.net multi-lingual analyser

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

Article
-------
ID
Name

Article_CultureInfo是:

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

我正在使用Nhibernate.Search.Mapping映射出字段/文档信息。 我想在可能的情况下结合基于词干的搜索功能和同义词分析。 有什么方法可以在运行时指定Lucene分析器,而不是在编译时指定/初始化吗?

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

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

谢谢!

我基本上已经为这种方法做了一个变通方法-有点过头了,但是行得通。

我创建了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");
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM