最簡單的解決方案是在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,這將很難維護。
您是否想要在Sitecore或同義詞列表中管理同義詞文件的路徑? –
@MarekMusielak同義詞列表。謝謝 – Snapper