indexación y búsqueda de texto completo en Elasticsearch sin dialitics utilizando c # client Nest

Estoy preparando un motor de búsqueda en el sitio con elasticsearch y soy nuevo en elasticsearch. Los sitios que usarán este motor sonTurco / inglés.

En Turquía, tenemos letras turcas como'ğ', 'ü', 'ş', 'ı', 'ö', 'ç'. Pero cuando buscamos generalmente usamos las letras'g', 'u', 's', 'i', 'o', 'c'. Esto no es una regla, pero generalmente lo hacemos, pensamos como un hábito, algo que solíamos hacer.

Ahora, tengo un tipo de documento llamado "producto" y este tipo tiene varias propiedades de cadena y algunas están anidadas. Por ejemplo:

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

Mi objetivo es este:

ProductName o Category.CategoryName puede contener letras turcas ("Eşarp") o algunos pueden estar mal escritos y escritos con letras en inglés ("Esarp")Querystring puede contener letras turcas ("eşarp") o no ("esarp")Querystring puede tener varias palabrasSe debe buscar en cada campo de cadena indexado en la cadena de consulta (búsqueda de texto completo)

Ahora, lo que hice:

Al crear el índice, también configuro asignaciones y utilicé unanalizador personalizado llamado "sanalyze" que usa "minúsculas"y"asciifolding"filtros y tokenizador estándar en lugar de analizador estándar.Usó ese analizador personalizado para las asignaciones de campos de cadena.

Código de ejemplo para mapeo:

// 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")))));
Eliminé, recreé e indexé mi índiceAhora estoy tratando de buscar en ese índice.

Intenté con dos consultas diferentes para buscar en los documentos almacenados:

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

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

El segundo no usa el método Analizador porque en la documentación de elasticsearch, dice que elasticsearch usará el analizador utilizado en un campo. Así que creo que no hay necesidad de definirlo nuevamente durante la búsqueda.

Lo que obtuve como resultado:

Primera consulta (con analizador ("sanalyze")): Cuando busco "eşarp" o "esarp", no hay resultados. Cuando busco "bordo", obtuve resultados.Segunda consulta (sin analizador ("sanalyze")): Cuando busco "eşarp", obtengo resultados. Cuando busco "esarp", no hay resultados. Cuando busco "bordo", obtuve resultados.

Por cierto:

Los documentos contienen "Eşarp"como valor de ProductName y cuando verifiqué elástico de búsqueda creado"esarp"término de campo.

Los documentos contienen "Bordo"como valor y"bordo"como término de campo.

No pude lograr lo que quiero. ¿Qué hago mal? - ¿Debo usar otro filtro en lugar de asciifolding? - ¿Debo usar preserveOriginal con asciifolding? No quiero usar esa opción para no atornillar puntajes. - Algo diferente que hacer?

¿Podrías ayudarme?

Si cree que no está claro lo que estoy preguntando, dígame, intentaré aclararlo.

Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta