индексация и полнотекстовый поиск в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? Я не хочу использовать эту опцию, чтобы не облажаться. - Что-то другое делать?

Не могли бы вы мне помочь?

Если вы думаете, что не понятно, о чем я прошу, скажите, пожалуйста, я постараюсь прояснить ситуацию.

Спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос