【问题标题】:Ignore special characters in Examine忽略检查中的特殊字符
【发布时间】:2014-01-23 15:33:37
【问题描述】:

在 Umbraco 中,我使用 Examine 在网站中进行搜索,但内容是法语的。一切正常,除了当我搜索“Français”时,它与“Francais”的结果不同。有没有办法忽略那些法语字符?我试图为 Leucene/Examine 找到一个 FrenchAnalyser,但没有找到任何东西。我使用 Fuzzy,所以即使单词不同,它也会返回结果。

这是我的搜索代码:

public static ISearchResults Search(string searchTerm)
        {
            var provider = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
            var criteria = provider.CreateSearchCriteria(BooleanOperation.Or);

            var crawl = criteria.GroupedOr(BoostedSearchableFields, searchTerm.Boost(15))
            .Or().GroupedOr(BoostedSearchableFields, searchTerm.Fuzzy(Fuzziness))
            .Or().GroupedOr(SearchableFields, searchTerm.Fuzzy(Fuzziness))
            .Not().Field("umbracoNavHide", "1");

            return provider.Search(crawl.Compile());
        }

【问题讨论】:

  • 我知道我不会很有帮助,但是,如果有办法,您可以在您正在搜索的内容中将所有特殊字符转换为普通字符。
  • 不是真的,我已经考虑过了,但是谢谢
  • 为什么不能替换字符?我真的没有看到任何其他方式。假设您已经检查了所有方法重载..
  • 问题不是当我搜索“Français”时,而是当我搜索没有特殊字符的“Francais”时。我没有得到任何结果。看起来索引是用特殊字符构建的,但即使我搜索没有特殊字符的单词,它也应该返回结果。

标签: c# umbraco lucene.net examine


【解决方案1】:

我们最终使用了基于 SnowballAnalyzer 的自定义分析器

public class CustomAnalyzer : SnowballAnalyzer
{
    public CustomAnalyzer() : base("French") { }

    public override TokenStream TokenStream(string fieldName, TextReader reader)
    {
        TokenStream result = base.TokenStream(fieldName, reader);

        result = new ISOLatin1AccentFilter(result);

        return result;
    }
}

【讨论】:

    【解决方案2】:

    尝试像下面这样使用正则表达式:

    var strInput ="Français";
    var strToReplace = string.Empty;
    var sNewString = Regex.Replace(strInput, "[^A-Za-z0-9]", strToReplace);
    

    我已使用此模式“[^A-Za-z0-9]”将所有非字母数字字符串替换为空白。

    希望对你有帮助。

    【讨论】:

    • 感谢 Israel,但问题是反过来,lucente.net 用“ç”索引所有内容,当我搜索“c”时,我希望结果包括那些“ç”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2023-03-22
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多