indexação e pesquisa de texto completo na elasticsearch sem dialítica usando o cliente c # Nest

Estou preparando um mecanismo de pesquisa no site com elasticsearch e sou novo no elasticsearch. Os sites que usarão esse mecanismo sãoTurco / inglês.

Na Turquia, temos letras turcas como'ğ', 'ü', 'ş', 'ı', 'ö', 'ç'. Mas quando procuramos geralmente usamos as letras'g', 'u', 's', 'i', 'o', 'c'. Isso não é uma regra, mas geralmente fazemos isso, pensamos como um hábito, algo que costumávamos fazer.

Agora, eu tenho um tipo de documento chamado "produto" e esse tipo tem várias propriedades de sequência e algumas estão aninhadas. Por exemplo:

public class Product {
    public string ProductName { get; set; }
    public Category Category { get; set; }
    //...
}
public class Category {
    public string CategoryName { get; set; }
    //...
}

Meu objetivo é este:

ProductName ou Category.CategoryName podem conter letras turcas ("Eşarp") ou alguns podem ser digitados incorretamente e escritos com letras em inglês ("Esarp")A consulta pode conter letras turcas ("eşarp") ou não ("esarp")A consulta pode ter várias palavrasCada campo de string indexado deve ser pesquisado na string de consulta (pesquisa de texto completo)

Agora, o que eu fiz:

Ao criar o índice, também configuro mapeamentos e usei umanalisador personalizado chamado "sanalyze" que usa "minúsculas"e"asciifolding"filtros e tokenizador padrão em vez do analisador padrão.Utilizou esse analisador personalizado para mapeamentos de campos de sequência.

Exemplo de código para mapeamento:

// 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")))));
Excluí, recriei e indexei meu índiceAgora estou tentando pesquisar nesse índice.

Eu tentei com duas consultas diferentes para pesquisar documentos armazenados:

q &= Query<ProductModel>.QueryString(t => t.Query(Keyword).Analyzer("sanalyze"));

q &= Query<ProductModel>.QueryString(t => t.Query(Keyword));

O segundo não usa o método Analyzer, porque na documentação do elasticsearch, ele diz que o elasticsearch usará o analisador usado em um campo. Portanto, acho que não há necessidade de defini-lo novamente durante a pesquisa.

O que eu tenho como resultado:

Primeira consulta (com analisador ("sanalisar")): Quando pesquiso "eşarp" ou "esarp", não há resultados. Quando pesquiso "bordo", obtive resultados.Segunda consulta (sem analisador ("sanalisar")): Quando pesquiso "eşarp", obtive resultados. Quando procuro "esarp", não há resultados. Quando pesquiso "bordo", obtive resultados.

BTW:

Os documentos contêm "Eşarp"como valor ProductName e quando eu verifiquei elasticsearch created"esarp"termo do campo.

Os documentos contêm "Bordo"como valor e"bordo"como termo de campo.

Não consegui alcançar o que queria. O que eu faço de errado? - Devo usar outro filtro em vez de dobrar? - Devo usar preserveOriginal com asciifolding? Não quero usar essa opção para não estragar as pontuações. - Algo diferente de fazer?

Você pode por favor me ajudar?

Se você acha que não está claro o que estou perguntando, diga-me, tentarei esclarecer.

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion