当前位置: 首页 > 知识库问答 >
问题:

忽略搜索中的特殊字符(标题)

郑宜民
2023-03-14

使用Umbraco v6,检查搜索(不是完整的Lucene查询)。这是一个拉丁/南美洲网站。我问过我的同事,他们如何在搜索/URL中键入标题(字母上的重音符号),他们都说他们没有,他们只使用“常规”字符(a-Z,a-Z)。

我知道在传递到Examine时如何从字符串中去掉特殊字符,但我需要另一种方法,如Examine从属性中删除特殊字符以匹配查询。我有许多“节点”的名称中有标题(这是我正在搜索的属性之一)。

我研究过的帖子:

  • 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”,但我以前从未使用过,也不知道要获取/安装/添加到VS中的是哪一个。这是更好的方法吗??

共有1个答案

江阳羽
2023-03-14

定制分析仪就是答案。

这在这里的翁布拉科论坛上得到了回答: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));
    }

}

然后在检查设置中参考分析仪。配置

 类似资料:
  • 问题内容: 有人知道是否可以对SQL Server数据库中的列进行%LIKE%搜索,但可以忽略该列中的任何特殊字符吗? 因此,例如,如果我有一个名为“歌曲”的列,并且其中包含以下内容… 黑或白 直到布鲁克林不睡觉 船歌 爸爸别讲 如果用户搜索“直到布鲁克林之前都不会偷偷摸摸”,那么即使他们忘记了撇号,我也希望它返回一个匹配项。如果他们搜索“ SOUL”,我也希望它返回第四行。我确定你知道这个主意。

  • 我有一个问题与搜索的特殊字符在solr。我的文档有一个字段标题,有时它可以像泰坦尼克号-1999(它有字符-)。当我试图搜索索尔与"-"我收到一个400错误。我试图逃避这个角色,所以我尝试了像“-”和“\-”这样的东西。有了这些变化,solr不会用错误来回应我,但它会返回0个结果。 如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容??? 问候 在这里更新您可以看到我当前的s

  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 问题内容: 我无法在Elasticsearch中以特殊字符结尾/开头的字符进行搜索。就像“ 123456!” 我的映射是 它给我错误,我可以在搜索查询(或映射)中做什么,以便特殊字符将被视为搜索字符串的一部分? 问题答案: 由于您的字段是(好!),请尝试用双引号引起来进行完全匹配: 这样做的另一种方法是在查询中设置分析器(但请务必转义,因为它是保留字符(对于操作员)

  • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

  • 要转义这些字符,请在字符前面使用\。例如,要搜索(1+1):2,请使用以下查询: 为此,我使用方法: 我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。 null