Ich habe kürzlich ElasticSearch verwendet. Ich versuche, einige Anwendungsfälle zu vervollständigen. Ich habe ein Problem für einen von ihnen.
Ich habe einige Benutzer mit ihrem vollen Namen indiziert (z. B. "Jean-Paul Gautier", "Jean De La Fontaine").
Ich versuche, alle vollständigen Namen als Antwort auf eine Abfrage zu erhalten.
Ich möchte zum Beispiel, dass die 100 häufigsten Vollnamen mit "J"
beginnen %Vor%Das Ergebnis, das ich bekomme, sind alle Wörter der vollständigen Namen: "Jean", "Paul", "Gautier", "De", "La", "Fontaine".
Wie bekommt man "Jean-Paul Gautier" und "Jean De La Fontaine" (alle full_name Werte bitten um 'J')? Die Option "post_filter" tut dies nicht, sie beschränkt nur die obige Teilmenge.
Danke
Sie müssen nur "index": "not_analyzed"
für das Feld festlegen, und Sie können die vollständigen, unveränderten Feldwerte in Ihrer Facette abrufen.
Normalerweise ist es nett, eine Version des Feldes zu haben, die nicht analysiert wird (zum Facettieren) und eine andere, die (zum Suchen) ist. Der Feldtyp "multi_field"
ist dafür nützlich.
In diesem Fall kann ich ein Mapping wie folgt definieren:
%Vor% Hier haben wir zwei Unterfelder. Der Name mit dem Namen des übergeordneten Elements wird standardmäßig verwendet. Wenn Sie also nach dem Feld "full_name"
suchen, verwendet Elasticsearch tatsächlich "full_name.full_name"
. "full_name.untouched"
gibt Ihnen die gewünschten Facettenergebnisse.
Als nächstes füge ich zwei Dokumente hinzu:
%Vor%Und dann kann ich auf jedes Feld schauen, um zu sehen, was zurückgegeben wird:
%Vor%und ich bekomme das folgende zurück:
%Vor%Wie Sie sehen können, gibt das analysierte Feld Token mit einem Wort und einem niedrigeren Kästchen zurück (wenn Sie keinen Analysator angeben, wird Standardanalysator wird verwendet, und das nicht analysierte Unterfeld gibt den unmodifizierten Originaltext zurück.
Hier ist ein ausführbares Beispiel, mit dem Sie spielen können: Ссылка
Versuchen Sie, das Mapping für "full_name" zu ändern:
%Vor% not_analyzed
bedeutet, dass es beibehalten wird, wie es ist, Großbuchstaben, Leerzeichen, Bindestriche usw., so dass "Jean De La Fontaine" bleibt auffindbar und nicht in "Jean" "De" "La" "Fontaine"
Sie können mit verschiedenen Analysegeräten experimentieren, indem Sie die API verwenden
Beachten Sie, was der Standard zu einem Mehrteilnamen macht:
%Vor%Tags und Links elasticsearch lucene