Elasticsearch - Filtern und Sortieren nach Namen mit Priority-Ausnahmen

8

Ich versuche, nach Namen mit Priorität Ausnahmen zu filtern und zu sortieren, was bedeutet, dass selbst wenn die Ergebnisse alphabetisch sortiert sind, zuerst ein bestimmter Name angezeigt werden soll.

Zum Beispiel - das ist meine Basisabfrage

%Vor%

Kurz gesagt, ich möchte, dass dieses Array ["pepsi", "rc-cola", "coca-cola"] sortiert wird, indem man oberste Priorität an "rc-cola" gibt wird sortiert nach ["rc-cola", "coca-cola", "pepsi"]

Im Moment wird alphabetisch sortiert. Ich dachte über ein paar Ideen nach, die funktionieren könnten:

  1. Fügen Sie ein "sollte" hinzu, indem Sie mit "Übereinstimmung" erhöhen. aber dann hatte ich ein Problem damit Sortiere nach "_score", es bricht meine alphabetische Sortierung, obwohl ich zuerst nach "_score" und nach dem Markennamen sortiere. Beispiel mit dem Hinzufügen zu dem "bool": "sollte": [{"match": {"brand.id": {"query": 34709, "boost": 20}}}

  2. Ich habe versucht mit "Aggregaten", so dass die erste Abfrage (Bucket) wäre "passt" den spezifischen Markennamen an und sortiert alphabetisch nach innen, der Die zweite Abfrage würde nur alphabetisch sortiert werden. aber ich habe total versaut.

Ich muss gefiltert - & gt; Filter, ich kann keine Scripts verwenden. Danke.

UPDATE Hier ist ein Beispiel für Dokumente und wie es gerade sortiert ist. Ich möchte, dass die Marke "ccc" zuerst priorisiert wird. Bitte helfen Sie mir, meine Anfrage zu aktualisieren.

%Vor%     
Beni Gazala 07.03.2017, 15:07
quelle

3 Antworten

4

Wenn Sie Elasticsearch Version 1.x verwenden, sollte folgende Abfrage Ihnen das erwartete Ergebnis liefern: (muss eventuell etwas angepasst werden, um bei Bedarf rohe Felder zu verwenden)

%Vor%

Bei späteren Versionen von Elasticsearch Die gefilterte Abfrage ist ersetzt durch die Bool-Abfrage , Diese Abfrage sollte den Job erledigen (mit ähnlicher Anpassung wie zuvor für die Verwendung von rohen Feldern, falls erforderlich)

%Vor%

In beiden Fällen können Sie die Boost-Funktion verwenden, wenn Sie möchten, dass der obere Teil in einer bestimmten Reihenfolge mit mehr als einer bevorzugten Übereinstimmung gefüllt wird

    
Olivier 17.03.2017, 15:42
quelle
3

Ich habe localy hier getestet. Um die Abfrage zu vereinfachen, fragen Sie NICHT nach Namen, sondern nach Marken-IDs, da Ihre Marke viele Namen haben könnte. Wenn Sie nach Namen sortieren möchten, können Sie das Skript nach Belieben ändern.

%Vor%     
Volodymyr Bilyachat 08.03.2017 23:37
quelle
3

Wenn die Priorität der Marke zur Indexzeit bekannt ist, können Sie sie direkt in Ihrem Dokument wie folgt indizieren:

%Vor%

Die Marken, die oben angezeigt werden, können einen hohen Popularitätswert haben, während der Rest einen Beliebtheitswert haben kann, der einem niedrigeren Wert zugeordnet ist.

Indem Sie es auf diese Weise indizieren, können Sie es direkt sortieren, indem Sie brand.popularity als primäre Sortierung und brand.names als sekundäre Sortierung verwenden

%Vor%     
Rahul 14.03.2017 13:16
quelle