индексация и полнотекстовый поиск вasticsearch без dialitics с помощью c # client Nest
Я готовлю поисковую систему на сайте сластиком поиска, и я новичок в поиске. Сайты, которые будут использовать этот движокТурецкий / английский.
В Турции у нас есть турецкие буквы, такие как'ğ', 'ü', 'ş', 'ı', 'ö', 'ç', Но когда мы ищем в целом, мы используем буквы'g', 'u', 's', 'i', 'o', 'c'. Это не правило, но мы обычно делаем это, думаем как привычка, то, к чему мы привыкли.
Теперь у меня есть тип документа с именем «product», и у этого типа есть несколько строковых свойств, и некоторые из них вложены. Например:
public class Product {
public string ProductName { get; set; }
public Category Category { get; set; }
//...
}
public class Category {
public string CategoryName { get; set; }
//...
}
Моя цель заключается в следующем:
ProductName или Category.CategoryName могут содержать турецкие буквы ("Eşarp") или некоторые из них могут быть опечатаны и написаны английскими буквами ("Esarp«)Строка запроса может содержать турецкие буквы ("eşarp") или нет ("esarp«)Строка запроса может содержать несколько словКаждое индексированное строковое поле должно быть найдено в строке запроса (полнотекстовый поиск)Теперь, что я сделал:
При создании индекса я также настраивал отображения и использовалпользовательский анализатор под названием "sanalyze" который используетв нижнем регистре" а также "asciifolding"фильтры и стандартный токенизатор вместо стандартного анализатора.Использовал этот пользовательский анализатор для отображения строковых полей.Пример кода для сопоставления:
// some more mappings which uses the same mapping for all string fields.
.Map<Yaziylabir.Extensions.TagManagement.Models.TagModel>(m => m.AutoMap().Properties(p => p
.String(s => s
.Name(n => n.Tag).Analyzer("sanalyze")))))
.Settings(s => s
.Analysis(ans => ans
.Analyzers(anl => anl
.Custom("sanalyze", c => c
.Tokenizer("standard")
.Filters("lowercase", "asciifolding")))));
Я удалил, пересоздал и проиндексировал мой индексСейчас я пытаюсь найти в этом индексе.Я попытался с помощью двух разных запросов для поиска по сохраненным документам:
q &= Query<ProductModel>.QueryString(t => t.Query(Keyword).Analyzer("sanalyze"));
q &= Query<ProductModel>.QueryString(t => t.Query(Keyword));
Второй не использует метод Analyzer, потому что в документации поasticsearch говорится, чтоasticsearch будет использовать анализатор, используемый на поле. Поэтому я думаю, что нет необходимости определять его снова при поиске.
Что я получил в результате:
Первый запрос (с анализатором ("sanalyze")): Когда я ищу "eşarp" или "esarp", результатов нет. Когда я ищу «бордо», я получаю результаты.Второй запрос (без анализатора («санализ»)): Когда я ищу «eşarp», я получаю результаты. Когда я ищу "esarp", нет результатов. Когда я ищу «бордо», я получаю результаты.КСТАТИ:
Документы содержат "Eşarp«В качестве значения ProductName и когда я проверил созданный elasticsearch»esarp"полевой термин.
Документы содержат "Bordo"как значение и"бордовый«как полевой термин.
Я не мог достичь того, чего хочу. Что я делаю не так? Я должен использовать другой фильтр вместо asciifolding? Следует использовать preserveOriginal с asciifolding? Я не хочу использовать эту опцию, чтобы не облажаться. - Что-то другое делать?
Не могли бы вы мне помочь?
Если вы думаете, что не понятно, о чем я прошу, скажите, пожалуйста, я постараюсь прояснить ситуацию.
Спасибо.