2017-09-27 108 views
0

我想創建一個lucene表達式來顯示兩個查詢的計數除法。這兩個查詢都包含文本信息,兩個結果都在消息字段中。我不知道如何正確寫入。到目前爲止,我所做的是沒有任何的運氣 -在kibana中劃分兩個不同查詢的計數

doc['message'].value/doc['message'].value 

的第一個查詢message包含文本 - "404 not found"

對於第二個查詢message包含文本 - "500 error"

我想要做的是count(404 not found)/count(500 error)

我將不勝感激任何幫助。

+0

我想我可以幫你,我只是想確認我理解正確的問:你需要一個計算結果,其中包含完全「404未找到」的不同文檔的數量除以包含完全「500錯誤」輸出的不同文檔的數量作爲浮點數? 假設對此,是否將消息字段映射爲「關鍵字」類型?如果不是,我需要對你想要的輸出做更多的說明。 – Miek

+0

@MikeMichaels是的,你是正確的輸出,我想也消息字段映射爲「關鍵字」類型 – jonny

回答

1

我要添加免責聲明,這將是顯著吸塵器只運行兩個單獨的罪名,並執行計算在客戶端這樣的:

GET /INDEX/_search 
{ 
    "size": 0, 
    "aggs": { 
    "types": { 
     "terms": { 
     "field": "type", 
     "size": 10 
     } 
    } 
    } 
} 

這將返回類似(除了使用您的區別鍵而不是在我的例子類型):

"aggregations": { 
    "types": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "Article", 
      "doc_count": 881 
     }, 
     { 
      "key": "Page", 
      "doc_count": 301 
     } 
     ] 
    } 

利用這一點,把你獨特的計數和計算平均值。

通過以上所指出,這裏是哈克的方式,我能夠從放在一起(通過單個請求)this

GET /INDEX/_search 
{ 
    "size": 0, 
    "aggs": { 
    "parent_agg": { 
     "terms": { 
     "script": "'This approach is a weird hack'" 
     }, 
     "aggs": { 
     "four_oh_fours": { 
      "filter": { 
      "term": { 
       "message": "404 not found" 
      } 
      }, 
      "aggs": { 
      "count": { 
       "value_count": { 
       "field": "_index" 
       } 
      } 
      } 
     }, 
     "five_hundreds": { 
      "filter": { 
      "term": { 
       "message": "500 error" 
      } 
      }, 
      "aggs": { 
      "count": { 
       "value_count": { 
       "field": "_index" 
       } 
      } 
      } 
     }, 
     "404s_over_500s": { 
      "bucket_script": { 
      "buckets_path": { 
       "four_oh_fours": "four_oh_fours.count", 
       "five_hundreds": "five_hundreds.count" 
      }, 
      "script": "return params.four_oh_fours/(params.five_hundreds == 0 ? 1: params.five_hundreds)" 
      } 
     } 
     } 
    } 
    } 
} 

這應該返回基於腳本中計算的總價值。

如果有人可以提供一個方法,除了這兩個,我很樂意看到它。希望這可以幫助。

編輯 - 通過「表達式」類型完成相同的腳本而不是無痛(默認)。只需更換與以下上面的腳本值:

 "script": { 
      "inline": "four_oh_fours/(five_hundreds == 0 ? 1 : five_hundreds)", 
      "lang": "expression" 
     } 

更新腳本在這裏完成通過Lucene的同樣的事情表達式

+0

謝謝你的建議,但我想知道這是否可以使用lucene表達式來完成?我對腳本非常陌生,並且希望有更簡單的方法來做到這一點。 – jonny

+0

瞭解。只是想知道,是否有什麼特別的理由讓你把它寫成lucene表達式vs無痛腳本(如我的例子)? – Miek

+0

我們正在研究一個由某人擁有的集羣,他們不希望啓用無痛腳本。除了lucene表達式對我來說似乎更容易。 – jonny