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