ElasticSearch 5.0:_score字段上的聚合?

时间:2016-11-11 15:39:15

标签: elasticsearch aggregation

我将我的Elasticsearch查询从1.7版本迁移到5.0版本(此时为最新版本),并且我在汇总方面遇到了一些问题。

我想在给定字段上进行聚合,并显示按分数排序的前5个文档。从我所读到的,过去常常这样做:

"aggs" : {
    "max_price" : { "max" : { "script" : "_score" } }
}

使用Sense,我得到的答案是" [top_score]中的意外标记VALUE_STRING [script]。"

有人经历过这个吗?

注意:对于旧版本,此处发布了答案:ElasticSearch: aggregation on _score field?

2 个答案:

答案 0 :(得分:0)

Elasticsearch的默认脚本语言现在是无痛而不是groovy。根据{{​​3}},您可以尝试:

"aggs" : {
    "max_price": {
        "max": {
            "script": {
                "lang": "groovy", 
                "inline": "_score"
            } 
        } 
    }
}

在Elasticsearch 5.x中更新,将有不推荐使用的日志,如:

  

[WARN] [o.e.d.d.g.groovyScriptEngineService] [groovy]脚本已弃用,请改用[无痛]脚本

更正确的方法是:

"aggs" : {
    "max_price": {
        "max": {
            "script": {
                "lang": "painless", 
                "inline": "_score"
            } 
        } 
    }
}

答案 1 :(得分:0)

如果您只需要按分数(总体而言)搜索条件的前5个文档,您可以将查询的大小设置为5,这应该可以解决问题(例如下面)

{ "size": 5, "query": { "bool": { "must": [ { "match": { "my_field": "whatever" } }, { "match": { "my_other_field": "whatever else" } } ], "should": [], "must_not": [], "filter": [] } }, "aggs": { "something": { "terms": { "field": "my_term" }, "aggs": { "field_stats": { "stats": { "field": "price" } } } } } }

另一方面,如果您想要每个桶的前5个评分文档,您是否考虑过使用热门点击聚合? https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html