[英]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.