一尘不染

ElasticSearch:_score字段上的聚合?

elasticsearch

我想在字段上使用statsextended_stats聚合,_score但是找不到完成此操作的任何示例(即,似乎只能将聚合与实际文档字段一起使用)。

是否有可能计算出“元数据”在ElasticSearch查询响应每个命中字段请求集合(例如,_score_type_shard,等等)?

我假设答案是“否”,因为未对类似字段_score进行索引…


阅读 277

收藏
2020-06-22

共1个答案

一尘不染

注意:就最新版本的Elasticsearch而言,原始答案现在已过时。使用Groovy脚本编写的等效脚本为:

{
    ...,
    "aggregations" : {
        "grades_stats" : { 
            "stats" : { 
                "script" : "_score" 
            } 
        }
    }
}

为了使此工作有效,您将需要启用动态脚本,或者甚至更好的方法是,存储基于文件的脚本并按名称执行(通过不启用动态脚本来增加安全性)!


您可以使用脚本,并使用doc.score引用分数。更多详细信息,请参见ElasticSearch的脚本文档

统计汇总示例如下:

{
    ...,
    "aggregations" : {
        "grades_stats" : { 
            "stats" : { 
                "script" : "doc.score" 
            } 
        }
    }
}

结果看起来像:

"aggregations": {
    "grades_stats": {
        "count": 165,
        "min": 0.46667441725730896,
        "max": 3.1525731086730957,
        "avg": 0.8296855776598959,
        "sum": 136.89812031388283
    }
}

直方图也可以是有用的聚合:

"aggs": {
    "grades_histogram": {
        "histogram": {
            "script": "doc.score * 10",
            "interval": 3
        }
    }
}

直方图结果:

"aggregations": {
    "grades_histogram": {
        "buckets": [
            {
               "key": 3,
               "doc_count": 15
            },
            {
               "key": 6,
               "doc_count": 103
            },
            {
               "key": 9,
               "doc_count": 46
            },
            {
               "key": 30,
               "doc_count": 1
            }
        ]
    }
}
2020-06-22