Ich bin der Umsetzung eines auto-complete-Index in Elasticsearch und haben sich zu einem Problem mit der Sortierung / Scoring laufen. Angenommen, ich habe die folgenden Strings in einem Index:
%Vor%Als ich für „Donut“ zu suchen, mag ich die Ergebnisse unter dem Begriff Standort wie so bestellt werden:
%Vor%Ich kann nicht herausfinden, wie ich das erreichen kann. Die Begriffsposition ist in der Standard-Bewertungslogik nicht berücksichtigt, und ich kann keine Möglichkeit finden, sie dorthin zu bringen. Es scheint wie eine einfache genug Frage aber, dass andere in diesen vor ausgeführt haben muss. Hat es schon jemand herausgefunden?
Danke!
Hier ist die Lösung, die ich gefunden habe, basierend auf Andreis Antwort und erweitert um mehrere Suchbegriffe und zusätzliche Punkte basierend auf der Länge des ersten Wortes im Ergebnis:
Definieren Sie zuerst den folgenden benutzerdefinierten Analysator (er behält die gesamte Zeichenfolge als einzelnes Token bei und behandelt sie klein):
%Vor%Zweitens definieren Sie Ihr Suchfeld-Mapping wie folgt (mein Name heißt "name"):
%Vor%Drittens: Wenn Sie den Index auffüllen, verwenden Sie die folgende Logik (meine in C #) zum Auffüllen:
%Vor%Schließlich suchen Sie wie folgt:
%Vor%Ich verwende match_phrase_prefix, so dass partielle Übereinstimmungen unterstützt werden, wie etwa "ap", das mit "apple" übereinstimmt. Die bool muss / sollte mit dieser zweiten query_string Abfrage gegen name.raw eine höhere Punktzahl für Ergebnisse geben, deren Name mit einem der Suchbegriffe beginnt (in meinem Code verarbeite ich den Suchstring, nur für diese zweite Abfrage, nach fügen Sie nach jedem Wort ein "*" hinzu. Schließlich bewirkt das Umbrechen der zweiten Abfrage in einem Skript function_score, das den Wert von _nameFirstWordLength verwendet, dass die von der zweiten Abfrage hochgezählten Ergebnisse weiter nach der Länge ihres ersten Worts sortiert werden (zum Beispiel, dass Apple vor Applebee angezeigt wird) / p>
Sie können eine benutzerdefinierte Sortierung wie folgt durchführen:
%Vor% Dort habe ich gerade den startOffset
zurückgegeben. Wenn Sie etwas anderes brauchen, spielen Sie mit diesen Werten und der ursprünglichen Bewertung und finden Sie einen komfortablen Wert für Ihre Bedürfnisse.
Oder Sie können etwas wie folgt machen:
%Vor%In beiden Fällen müssen Sie in Ihrem Mapping für dieses spezifische Feld Folgendes haben:
%Vor% bedeutet index_options
muss auf offsets
gesetzt werden. Hier weitere Details dazu.
Tags und Links elasticsearch