【问题标题】:Index no result when keyword contains mutated vowel (umlaut)当关键字包含变异元音(元音变音)时索引无结果
【发布时间】:2013-11-07 09:22:57
【问题描述】:
我在客户环境中有一种奇怪的行为。我们已经用Sitecore 设置了一个Lucene 索引。使用包含变异元音(元音变音符号,例如äöü,例如Zürich)的关键字搜索索引时,即使有一些结果也不会返回。在我们的环境中,这工作得很好。据我所知,解决方案的配置和设置在两个系统上都是相同的。
我用Luke 查看了这两个索引。他们似乎也一样。使用包含变异元音的关键字进行搜索返回与 Luke 相同的结果。所以索引本身应该没问题,只是查询似乎不同。
我认为操作系统上一定缺少配置/安装,或者可能是 IIS 本身,或者还有什么可能导致这种情况?
有人有类似经历吗?
谢谢,
塞尔吉
【问题讨论】:
标签:
c#
sitecore
lucene.net
【解决方案1】:
我在 Solr 和 Lucence 上遇到了类似的问题,结果在客户环境中我必须将 URIEncoding="UTF-8" 添加到以下配置文件中的“连接器”节点。
C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\server.xml
您的问题可能不完全相同,但我会研究字符编码问题。
【解决方案2】:
我不确定您客户的环境发生了什么,但是,下面的解决方案可能会派上用场解决这个问题以及可能源于搜索具有特殊字符的单词的其他问题。
以下方法将从文本字符串中删除任何变音符号。例如,如果您将其传递给Zürich,它将返回Zurich。诀窍是在索引之前通过此方法传递您的内容。在 Sitecore 6 中,这可以在 DatabaseCrawler 的自定义实现中完成。在 Sitecore 7 中,计算字段可能是一个不错的候选者。
public static string NormalizeDiacritics(this string input)
{
if (String.IsNullOrEmpty(input)) return String.Empty;
var sb = new StringBuilder();
foreach (var c in input.Normalize(NormalizationForm.FormD))
{
if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
sb.Append(c);
}
return sb.ToString();
}
下一步也是通过相同的方法传递访问者的搜索查询。这样,您可以放心,搜索Zürich 或Zurich 将始终返回结果。这特别方便,因为许多访问者在在线搜索时不会花时间输入特殊字符(至少对于说英语的访问者来说是这样)。