2014-10-06 69 views
9

我想通过top.hit的doc.score命令桶。我目前的实施情况如下。Elasticsearch聚合排序按最高得分得分

group_by_iid: { 
    terms: { 
     field: 'iid', 
     order: { max_score: 'desc' }, 
     size: 0 
    }, 
    aggs: { 
     max_score: { max: { script: 'doc.score' } }, 
     top_hit: { 
     top_hits: { 
      sort: [{ source_priority: { order: 'desc' } }], 
      size: 1 
     } 
     } 
    } 
    } 

这是错误的,因为桶按其最高分排序,而不是其顶级source_priority文档的分数。有没有办法解决这个问题?

回答

10

我有同样的问题,我解决它的方式是在文档分数上引入一个子聚合。然后在我的外部聚合中,我按照max_score聚合的名称排序。

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" 
       } 
      } 
      } 
    } 
    }  
} 

我跟着这个链接上的指示:

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

+11

如果你的文件正好有一个“分数”字段,你要像“最大”度量标准聚合与计算的分数工作通过elasticsearch而不是文档定义的,聚合中的脚本应该是“_score”,而不是“doc.score”。 – Shadocko 2015-02-04 11:14:55

+0

@Shadocko是的!这相当具有误导性。感谢您的评论。我正在尝试相同的例子,现在它可以工作。 – Darby 2015-05-27 23:17:02

+0

你知道如何用分区解决它吗?我的问题在这里 https://stackoverflow.com/questions/46484351/elasticsearch-aggregation-order-by-top-hit-score-with-partitions – KingWu 2017-09-29 08:04:23