2016-09-29 1 views
1

Ich möchte eine bestimmte Art auf eine Abfrage anwenden, sollte es zuerst meine Dokumente durch einen einzigen Wert sortieren dann alle anderen. Ich muss etwas wie das ORDER BY CASE WHEN in MySQL erreichen, aber ich konnte nicht finden, wie man es macht.Elasticsearch Reihenfolge von einem bestimmten Feld Wert zuerst

Jedes Element im Index in Elastic hat die folgende Struktur:

{ 
    "id": 123, 
    "name": "Title", 
    "categories": ["A", "B", "C"], 
    "price": 100, 
    "city": "London", 
    "country": "United Kingdom", 
    "status": 1 
} 

ich die folgende Abfrage:

{ 
    "fields": [], 
    "sort": [{"price": {"order": "asc"}}], 
    "size": 0, 
    "query": { 
     "query_string": { 
      "query": "status:1 AND country:'United Kingdom'" 
     } 
    }, 
    "aggs": { 
     "id": { 
      "terms": { 
       "field": "id", 
       "size": 10 
      } 
     } 
    } 
} 

So durch die Spalte city mit dem Wert "Liverpool" erste Sortierung und unter Berücksichtigung das folgende Beispiel:

{"id": 1, "name": "Test", "categories": ["A", "B", "C"], "price": 100, "city": "London", "country": "United Kingdom", "status": 1 } 
{"id": 2, "name": "Sample", "categories": ["A", "D", "F"], "price": 200, "city": "Manchester", "country": "United Kingdom", "status": 1 } 
{"id": 3, "name": "Title", "categories": ["X", "Y", "Z"], "price": 1000, "city": "Liverpool", "country": "United Kingdom", "status": 1 } 

Ich erwarte, als outpu zu haben t die folgende ID: 3, 1, 2.

Wie kann ich meine Abfrage ändern, um dieses Verhalten zu erhalten?

UPDATE: Die Version ist 1.7.2

+0

Was wäre der ORDER BY CASE WHEN in Ihrem Fall? – Val

+0

Haben Sie endlich eine Lösung für Ihren Fall gefunden? –

Antwort

0

Eigentlich Sie zuerst, dann nach Stadt sortieren möchten nach Preis? Der Schlüsselpunkt ist die Art der "Stadt" abgelegt, es ist String (vielleicht setzen Sie analysiert?) Nicht Ganzzahl. Also, wenn Sie auf eingereicht „Stadt“, analysiert Set, sollten Sie besser eine Eigenschaft mit dem Namen „raw“ hinzufügen, ohne analysiert, dann können Sie durch „Stadt sortieren. Ersten

Versuchen Sie Folgendes:

"sort": [{"city.raw": {"order": "asc"}},{"price": {"order": "asc"}}], 

Sie können https://www.elastic.co/guide/en/elasticsearch/guide/current/multi-fields.html für weitere Hilfe besuchen.

Andernfalls, wenn Sie nur die „Liverpool“ Stadt machen müssen zuerst dann andere Städte als Such- und Sortier, sollten Sie Boost-Funktion in der Abfrage verwenden. Besuchen Sie https://www.elastic.co/guide/en/elasticsearch/guide/2.x/multi-query-strings.html für weitere Hilfe.

0

Sie solltenverwendenfür Version 1.7. Versuchen Sie folgendes:

1,7:

"query" : { 
    .... 
}, 
"sort" : { 
    "_script" : { 
     "script" : "doc['city'].value == 'Liverpool' ? 1 : 0", 
     "type" : "number", 
     "order" : "desc" 
    }, 
    "example_other_field_order":"asc", 
    "next_example_field_order":"asc" 
} 

Für neueste Version von Elasticsearch (> = 5.5) überprüfen this doc.

Verwandte Themen