【问题标题】:ElasticSearch: aggregation on _score field?ElasticSearch:_score 字段的聚合?
【发布时间】:2014-08-24 19:26:37
【问题描述】:

我想在_score 字段上使用statsextended_stats 聚合,但找不到任何这样做的示例(即,您似乎只能对实际文档字段使用聚合)。

是否可以为 ElasticSearch 查询响应中的每个命中请求聚合计算的“元数据”字段(例如,_score_type_shard 等)?

我假设答案是“否”,因为像 _score 这样的字段没有被索引...

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

    为了完成这项工作,您需要启用动态脚本,或者更好的是,存储基于文件的脚本并按名称执行(通过不启用动态脚本来增加安全性)!


    您可以使用脚本并使用 doc.score 参考分数。 ElasticSearch 的脚本documentation 提供了更多详细信息。

    示例统计信息聚合可以是:

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

    结果如下:

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

    histogram 也可能是一个有用的聚合:

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

    【讨论】:

    • 正如这个答案所预测的那样,我收到一个关于“类型 [inline]、操作 [aggs] 和 lang [groovy] 的脚本被禁用”的错误。我似乎通过使用 {"script": "_score", "lang": "expression"} 避开了限制,即使我没有启用动态脚本,它也可以正常工作。
    【解决方案2】:

    doc.score 似乎不再起作用了。使用_score 似乎效果很好。

    例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2020-02-18
      • 2016-11-23
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多