Игнорировать специальные символы в экзамене
В 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();