2016-01-04 82 views
4

我已經更改了我的DefaultIndexConfiguration配置文件以基於同義詞進行搜索(http://firebreaksice.com/sitecore-synonym-search-with-lucene/),它工作正常。然而,這是基於在一個XML文件中的文件系統sitecore搜索同義詞文件位置

<param hint="engine" type="Sitecore.ContentSearch.LuceneProvider.Analyzers.XmlSynonymEngine, Sitecore.ContentSearch.LuceneProvider"> 
    <param hint="xmlSynonymFilePath">C:\inetpub\wwwroot\website\Data\synonyms.xml</param> 
</param> 

我想要做的就是有這個數據在CMS管理。 有誰知道我該如何設置這個xmlSynonymFilePath參數來實現我想要的?或者我錯過了什麼?

+0

您是否想要在Sitecore或同義詞列表中管理同義詞文件的路徑? –

+0

@MarekMusielak同義詞列表。謝謝 – Snapper

回答

3

最簡單的解決方案是在Sitecore中創建一個項目(例如/sitecore/system/synonyms),該模板只使用一個名爲Synonyms的多行字段,並將xml保留在該字段中,而不是從文件中讀取。

然後創建的ISynonymEngine喜歡您的自定義實現(這只是最簡單的例子 - 這是生產準備代碼):

public class CustomSynonymEngine : Sitecore.ContentSearch.LuceneProvider.Analyzers.ISynonymEngine 
{ 
    private readonly List<ReadOnlyCollection<string>> _synonymGroups = new List<ReadOnlyCollection<string>>(); 

    public CustomSynonymEngine() 
    { 
     Database database = Sitecore.Context.ContentDatabase ?? Sitecore.Context.Database ?? Database.GetDatabase("web"); 
     Item item = database.GetItem("/sitecore/system/synonyms"); // or whatever is the path 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.LoadXml(item["synonyms"]); 
     XmlNodeList xmlNodeList = xmlDocument.SelectNodes("/synonyms/group"); 

     if (xmlNodeList == null) 
      throw new InvalidOperationException("There are no synonym groups in the file."); 

     foreach (IEnumerable source in xmlNodeList) 
      _synonymGroups.Add(
       new ReadOnlyCollection<string>(
        source.Cast<XmlNode>().Select(synNode => synNode.InnerText.Trim().ToLower()).ToList())); 
    } 

    public IEnumerable<string> GetSynonyms(string word) 
    { 
     Assert.ArgumentNotNull(word, "word"); 
     foreach (ReadOnlyCollection<string> readOnlyCollection in _synonymGroups) 
     { 
      if (readOnlyCollection.Contains(word)) 
       return readOnlyCollection; 
     } 
     return null; 
    } 
} 

並註冊在Sitecore的配置,而不是默認引擎引擎:

<analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.PerExecutionContextAnalyzer, Sitecore.ContentSearch.LuceneProvider"> 
    <param desc="defaultAnalyzer" type="Sitecore.ContentSearch.LuceneProvider.Analyzers.DefaultPerFieldAnalyzer, Sitecore.ContentSearch.LuceneProvider"> 
    <param desc="defaultAnalyzer" type="Sitecore.ContentSearch.LuceneProvider.Analyzers.SynonymAnalyzer, Sitecore.ContentSearch.LuceneProvider"> 
     <param hint="engine" type="My.Assembly.Namespace.CustomSynonymEngine, My.Assembly"> 
     </param> 
    </param> 
    </param> 
</analyzer> 

這是不是生產就緒代碼 - 它只能讀取同義詞列表一次CustomSynonymsEngine類實例化(我不知道Sitecore是否保留實例或多次創建新實例)。

您應該擴展此代碼以緩存同義詞並在每次更改同義詞列表時清除緩存。

另外,你應該考慮在Sitecore樹中有一個很好的同義詞結構,而不是有一個項目和xml blob,這將很難維護。

+0

謝謝@Marek Musielak。我正在處理您的建議並取得良好進展。很好的答案。 – Snapper

+1

嗨Marek Musielak 您知道我們如何配置SOLR? 我無法找到SOLR的任何解決方案。 我想從Sitecore配置同義詞文件。 如果你對此提出任何建議,那將會很棒。 謝謝 –