簡體   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