Indizierung und Volltextsuche in elasticsearch ohne Dialektik mit dem c # -Client Nest
Ich bereite eine In-Site-Suchmaschine mit Elasticsearch vor und bin neu bei Elasticsearch. Websites, die diese Engine verwenden, sindTürkisch / Englisch.
n der Türkei haben wir türkische Buchstaben wie 'ğ', 'ü', 'ş', 'ı', 'ö', 'ç'. Aber wenn wir allgemein suchen, verwenden wir die Buchstaben 'g', 'u', 's', 'i', 'o', 'c'. Dies ist keine Regel, aber wir tun es im Allgemeinen, denken wie eine Gewohnheit, etwas, das wir früher getan haben.
Now, ich habe einen Dokumenttyp namens "Produkt" und dieser Typ hat mehrere Zeichenketteneigenschaften und einige sind verschachtelt. Beispielsweise
public class Product {
public string ProductName { get; set; }
public Category Category { get; set; }
//...
}
public class Category {
public string CategoryName { get; set; }
//...
}
Mein Ziel ist das:
ProductName oder Category.CategoryName können türkische Buchstaben enthalten (" Eşarp ") oder einige sind möglicherweise falsch geschrieben und mit englischen Buchstaben (" Esarp ")Querystring kann türkische Buchstaben enthalten (" eşarp") oder nicht (" esarp ")Querystring kann mehrere Wörter habenJedes indizierte Stringfeld sollte gegen Querystring durchsucht werden Volltextsuch)Nun, was ich getan habe:
Während ich einen Index erstelle, konfiguriere ich auch Zuordnungen und verwende eincustom Analyzer namens "sanalyze" welches " Kleinbuchstaben" und " asciifolding "Filter und Standard-Tokenizer anstelle von Standard-Analyzer.Benutzt diesen benutzerdefinierten Analysator für Zuordnungen von Zeichenfolgenfeldern.Beispielcode für die Zuordnung:
// 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")))));
Ich habe meinen Index gelöscht, neu erstellt und indiziertetzt versuche ich, in diesem Index zu sucheIch habe mit zwei verschiedenen Abfragen versucht, nach gespeicherten Dokumenten zu suchen:
q &= Query<ProductModel>.QueryString(t => t.Query(Keyword).Analyzer("sanalyze"));
q &= Query<ProductModel>.QueryString(t => t.Query(Keyword));
Die zweite Methode verwendet die Analysator-Methode nicht, da in der Elasticsearch-Dokumentation angegeben ist, dass Elasticsearch den in einem Feld verwendeten Analysator verwendet. Ich glaube, es ist nicht nötig, es während der Suche erneut zu definieren.
Was ich als Ergebnis bekommen habe:
Erste Abfrage with Analyzer ("sanalyze")): Wenn ich nach "eşarp" oder "esarp" suche, werden keine Ergebnisse angezeigt. Wenn ich nach "bordo" suche, erhalte ich Ergebnisse. Zweite Abfrage ohne Analyzer ("sanalyze")): Wenn ich nach "eşarp" suche, erhalte ich Ergebnisse. Wenn ich nach "esarp" suche, werden keine Ergebnisse angezeigt. Wenn ich nach "bordo" suche, erhalte ich Ergebnisse.BTW:
Dokumente enthalten " Eşarp "als ProductName-Wert und als ich Elasticsearch aktiviert habe" esarp "Feldbegriff.
Dokumente enthalten " Bordo "als Wert und" bordo "als Feldbegriff.
Ich konnte nicht erreichen, was ich will. Was mache ich falsch? - Soll ich einen anderen Filter anstelle von ASCII verwenden? - Soll ich preserveOriginal mit Asciifolding verwenden? Ich möchte diese Option nicht nutzen, um keine Ergebnisse zu erzielen. - Etwas anderes zu tun?
Kannst du mir bitte helfen
Wenn Sie der Meinung sind, dass es nicht klar ist, wonach ich frage, sagen Sie mir bitte, ich werde versuchen, es klarer zu machen.
Vielen Dank