繁体   English   中英

Elasticsearch无法从BucketScript中读取ScriptedMetric?

[英]Elasticsearch can't read ScriptedMetric from BucketScript?

我应该工作,因为ScriptedMetric是一个指标,它确实返回一个数字值,但是我无法使其正常工作。

我在C#中使用NEST(5.5.0通过NuGet,我的目标是Elasticsearch 6.0.0)使其工作,但是我也尝试在Kibana中构建相同的查询以排除NEST的问题。 在基巴纳语中,我得到了完全相同的错误。

错误:

buckets_path必须引用数字值或单值数字量度聚合,得到:org.elasticsearch.search.aggregations.metrics.scripted.InternalScriptedMetric

我的代码:

ISearchResponse<LogItem> aggregationResponse = await client.SearchAsync<LogItem>(s => s
    .Size(0)
    .Type("errordoc")
    .Query(...)
    .Aggregations(a => a
    .Terms("Hash", st => st
        .Field(o => o.messageHash.Suffix("keyword")).OrderDescending("Avg-Score")
            .Aggregations(aa => aa
                .Terms("Friendly", ff => ff
                    .Field(oo => oo.friendly.Suffix("keyword"))
                )
                .Max("Max-DateTime", ff => ff
                    .Field(oo => oo.dateTimeStamp)
                )
                .Average("Avg-Score", sc => sc
                    .Script("_score")
                )
                .ScriptedMetric("Urgency-Level", sm => sm 
                    .InitScript(i => i.Inline("params._agg.data = []").Lang("painless"))
                    .MapScript(i => i.Inline("params._agg.data.add(doc.urgency.value)").Lang("painless"))
                    .CombineScript(i => i.Inline("int urgency = 0; for (u in params._agg.data) { urgency += u } return urgency").Lang("painless"))
                    .ReduceScript(i =>i.Inline("int urgency = 0; for (a in params._aggs) { urgency += a } return urgency").Lang("painless"))
                )
                .BucketScript("finalScore", scb => scb
                    .BucketsPath(bp => bp
                        .Add("maxDateTime", "Max-DateTime")
                        .Add("avgScore", "Avg-Score")
                        .Add("urgencyLevel", "Urgency-Level")
                    )
                    .Script(i => i.Inline("params.avgScore").Lang("painless"))
                )
            )
       )
    )
);

ScriptedMetric聚合返回的数据集为11。

难道我做错了什么? 还是不可能? 如果不可能的话,有什么替代方法?

另外,我知道这个ScriptedMetric确实做了Sum会做的事情,但这当然会改变...

索引映射:

PUT /live
{
  "mappings": {
    "errordoc": {
      "properties": {
        "urgency": {
          "type": "integer"
        },
        "dateTimeStamp": {
          "type": "date",
          "format": "MM/dd/yyyy hh:mm:ss a"
        }      }
    }
  }
}

测试数据:

POST /live/errordoc
{ "messageID": "M111111", "messageHash": "1463454562\/-1210136287\/-1885530817\/-275007043\/-57589585", "friendly": "0", "urgency": "1", "organisation": "Organisation Name", "Environment": "ENV02", "Task": "TASK01", "Action": "A12", "dateTimeStamp": "11\/29\/2017 10:24:21 AM", "machineName": "DESKTOP-SMOM9R9", "parameters": "{ " }

复制此文档几次,也许更改urgency / dateTimeStamp,只要哈希保持不变,它就应该重现我的环境...

创建了2个GitHub问题后,Elasticsearch论坛上的某人回答了...我确实尝试了所有方法,包括此解决方案,但是在尝试过程中我一定做错了其他东西...好吧...

解决方案

更改:

.Add("urgencyLevel", "Urgency-Level")

至:

.Add("urgencyLevel", "Urgency-Level.value")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM