簡體   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