在检查搜索中忽略特殊字符(标题)

本文关键字:特殊字符 标题 检查 搜索 | 更新日期: 2023-09-27 18:03:46

使用Umbraco v6,检查搜索(不是完全成熟的Lucene查询)。这是一个拉丁/南美网站。我问过我的同事,他们如何在搜索/URL中输入标题(重音标记在字母上),他们都说他们不会,他们只是使用"常规"。字符(A-Z, A-Z).

我知道如何在传递给检查时剥离字符串的特殊字符OUT,但我需要另一种方式,如在检查中从属性中删除特殊字符以匹配查询。我有无数的"节点"。在名称中有标题(这是我正在搜索的属性之一)。

我研究过的帖子:

  • http://shazwazza.com/categories/Examine?p=2
  • 忽略检查
  • 中的特殊字符
  • https://groups.google.com/forum/!主题/umbraco-dev W6cWyPOc43Y

我试过写luence查询(或我认为),但我没有得到任何命中。

// q is my query from QueryString
var searcher = ExamineManager.Instance.SearchProviderCollection["CustomSearchSearcher"];
//var query = searcher.CreateSearchCriteria().Field("nodeName", q).Or().Field("description", q).Compile();
//var searchResults = searcher.Search(query).OrderByDescending(x => x.Score).TakeWhile(x => x.Score > 0.05f);
var searchResults = searcher.Search(Global.RemoveSpecialCharacters(q), true).OrderByDescending(x => x.Score).TakeWhile(x => x.Score > 0.05f);
全球类

    public static string RemoveSpecialCharacters(string str)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.Length; i++)
        {
            if ((str[i] >= '0' && str[i] <= '9')
                    || (str[i] >= 'A' && str[i] <= 'z' || (str[i] == '.' || str[i] == '_'))
                || str[i] == 'á' || str[i] == 'é' || str[i] == 'í' || str[i] == 'ñ' || str[i] == 'ó' || str[i] == 'ú')
            {
                sb.Append(str[i]);
            }
        }
        return sb.ToString();
    }

如上所述,我需要从Lucene中删除特殊字符(标题),而不是传入的查询。

从:https://our.umbraco.org/documentation/reference/searching/examine/overview-explanation

我也读过"Analyzers",但我从来没有使用过他们,也不知道哪一个(s)获得/安装/添加到VS,等等。这是更好的处理方式吗?

在检查搜索中忽略特殊字符(标题)

一个定制的分析器就是答案。

这个问题在umbraco论坛上有答案:https://our.umbraco.org/forum/developers/extending-umbraco/16396-Examine-and-accents-for-portuguese-language

创建一个分析器,去掉所有特殊字符:

  public class CIAIAnalyser : Analyzer
{
    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
    {
        StandardTokenizer tokenizer = new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_29, reader);
        tokenizer.SetMaxTokenLength(255);
        TokenStream stream = new StandardFilter(tokenizer);
        stream = new LowerCaseFilter(stream);
        return new ASCIIFoldingFilter(stream);
    }
}

然后对搜索输入执行相同的操作。

   public class CleanAccent
{
    public static string RemoveDiacritics(string input)
    {
        // Indicates that a Unicode string is normalized using full canonical decomposition.
        if (String.IsNullOrEmpty(input)) return input;
        string inputInFormD = input.Normalize(NormalizationForm.FormD);
        var sb = new StringBuilder();
        for (int idx = 0; idx < inputInFormD.Length; idx++)
        {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(inputInFormD[idx]);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(inputInFormD[idx]);
            }
        }
        return (sb.ToString().Normalize(NormalizationForm.FormC));
    }
}

然后在examinessettings .config中引用分析器。