Игнорировать специальные символы в экзамене

В Umbraco я использую Examine для поиска по сайту, но контент на французском. Все работает отлично, за исключением того, что когда я ищу "Français", это не тот же результат, что и "Francais". Есть ли способ игнорировать этих французских персонажей? Я пытаюсь найти французский анализатор для Leucene/Examine, но ничего не нашел. Я использую 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());
        }

3 ответа

Решение

В итоге мы использовали собственный анализатор, основанный на 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;
    }
}

Попробуйте использовать Regex, как показано ниже:

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

Я использовал этот шаблон "[^A-Za-z0-9]", чтобы заменить всю не буквенно-цифровую строку пробелом.

Надеюсь, поможет.

Фактически вы можете преобразовать символы Юникода с диакритическими знаками в английские эквиваленты, используя следующий метод. Это позволит вам искать «Français» с поисковым запросом «Francais».

      public static string RemoveDiacritics(this string text)
{
    if (string.IsNullOrWhiteSpace(text))
        return text;

    text = text.Normalize(NormalizationForm.FormD);
    var chars = text.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();

    return new string(chars).Normalize(NormalizationForm.FormC);
}

Используйте его в любой строке следующим образом:

      var converted = unicodeString.RemoveDiacritics();
Другие вопросы по тегам