2014-10-06 5 views
9

Ich möchte Buckets von doc.score von top_hit bestellen. Meine aktuelle Implementierung ist unten.Elasticsearch Aggregation Reihenfolge von Top-Hit-Score

Dies ist falsch, weil Buckets nach ihrem höchsten Punktestand sortiert sind, nicht nach dem höchsten Punktestand des source_priority-Dokuments. Gibt es eine Möglichkeit, dieses Problem zu lösen?

Antwort

10

Ich hatte das gleiche Problem, und die Art, wie ich es gelöst habe, war eine Sub-Aggregation auf dem Docs-Score einzuführen. Dann ordnete ich in meiner äußeren Aggregation die max_score Aggregation an.

GET /my-index/my-type/_search 
{ 
    "query": { 
     "bool" : { 
     "should" : [ { 
      "match" : { 
      "searchTerm" : { 
       "query" : "style", 
       "type" : "boolean" 
      } 
      } 
     }, 
     { 
      "flt_field" : { 
      "searchTerm" : { 
       "like_text" : "style" 
      } 
      } 
     }] 
     } 
    }, 
    "aggs": { 
     "group_by_target_url": { 
      "terms": { 
      "field": "targetUrl", 
      "order": { 
       "max_score": "desc" 
      } 
      }, 
      "aggs": { 
      "max_score": { 
       "max": { 
       "script": "doc.score" 
       } 
      } 
      } 
    } 
    }  
} 

Ich folgte den Anweisungen auf diesen Link:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

+11

Wenn Ihre Dokumente haben, passieren ein „Score“ -Feld und Sie wollen eine Metriken Aggregation wie „max“ mit der Partitur arbeiten berechnet von elasticsearch und nicht vom Dokument definierten, sollte das Skript in der Aggregation "_score" sein, nicht "doc.score". – Shadocko

+0

@Shadocko ja! das ist ziemlich irreführend. Danke für den Kommentar. Ich probiere das gleiche Beispiel aus und jetzt funktioniert es. – Darby

+0

Wissen Sie, wie Sie es mit Partitionen lösen können? Meine Frage ist hier https://stackoverflow.com/questions/46484351/elasticsearch-aggregation-order-by-top-hit-score-with-partitions – KingWu