kibana java script_Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布 - TGCode...
在之前的文章 “Elasticsearch:使用 Runtime fields 對索引字段進行陰影處理以修復錯誤 – 7.11 發布”,我展示了如何使用 runtime field 來 shadow 一個已有的在 mapping 中的字段,比如 duration。在今天的練習中,我將展示如何創建一個嶄新的字段并進行數據的統計。在這里請注意的是:新增加的 runtime field 并不在 source 中添加,而只是在查詢時生成的,也即 schema on read。
在接下來的練習中,它包含創建 runtime field 的演示,其中從包含日期的時間戳字段中計算星期幾。 然后使用索引字段和新創建的 runtime field 在 Kibana Lens 中創建可視化文件。 Runtime field 是在 Elasticsearch 中讀取時為 schema 的實現提供的名稱。
展示
我們先來創建一個 index mapping:
#Create the index mapping
PUT date_to_day
{
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd"
},
"response_code": {
"type": "integer"
}
}
}
}
在上面,我們展示了兩個字段: timestamp 以及 response_code。由于有一個時間戳,我們可以從這個時間戳中導出時間所在的 day of week,也就是星期幾。這個對于我們想對一周的每一天統計非常有用。
我們通過如下的 bulk API 來導入數據:
#Load a few documents to work with
POST date_to_day/_bulk
{"index":{}}
{"response_code": 200, "timestamp": "2021-01-01"}
{"index":{}}
{"response_code": 300, "timestamp": "2021-01-03"}
{"index":{}}
{"response_code": 200, "timestamp": "2021-01-04"}
{"index":{}}
{"response_code": 400, "timestamp": "2021-01-01"}
{"index":{}}
{"response_code": 300, "timestamp": "2021-01-05"}
{"index":{}}
{"response_code": 200, "timestamp": "2020-12-21"}
{"index":{}}
{"response_code": 200, "timestamp": "2021-01-02"}
{"index":{}}
{"response_code": 200, "timestamp": "2021-01-08"}
{"index":{}}
{"response_code": 300, "timestamp": "2021-01-09"}
{"index":{}}
{"response_code": 400, "timestamp": "2021-01-09"}
由于我們想對一周內的每一天來進行統計。一種辦法是重新建立一個新的 mapping。在這個新的 mapping 里包含這個 day of week 的定義。并在數據導入之前我們對數據進行處理。在實際的使用中,面對大量的已有數據,這樣的處理可能非常費力。我們可以使用 runtime field 來完成想要的功能。
在搜索請求時使用
由于 runtime field 是動態生成的,它需要計算機來進行處理。在很多的時候,我們并不想修改 mapping 來完成。我們只想針對一些搜索來進行生成這個 runtime field,或者只是作為在修改 mapping 前的一個練習來驗證 runtime field 的正確性。我們使用如下的命令來生產這類的 runtime field:
#Create an ephemeral runtime field for day of week and aggregate on it
GET date_to_day/_search
{
"runtime_mappings": {
"day_of_week": {
"type": "keyword",
"script": {
"source": """emit(doc['timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.SHORT, Locale.ROOT))"""
}
}
},
"size": 0,
"aggs": {
"terms": {
"terms": {
"field": "day_of_week"
}
}
}
}
在上面的命令中,我們可以仔細閱讀這個部分:
"runtime_mappings": {
"day_of_week": {
"type": "keyword",
"script": {
"source": """emit(doc['timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.SHORT, Locale.ROOT))"""
}
}
},
這個不是是使用 script 來生成一個叫做 day_of_week 的 runtime 字段。而這個字段只存在于這個搜索中。在執行完這個搜索后,這字段將自動消失。這個 day_of_week 字段是根據 timestamp 導引出來的,是之前的 mapping 中完全沒有的字段。
上面命令的執行結果為:
{
"took" : 16,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"terms" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Fri",
"doc_count" : 3
},
{
"key" : "Sat",
"doc_count" : 3
},
{
"key" : "Mon",
"doc_tgcodecount" : 2
},
{
"key" : "Sun",
"doc_count" : 1
},
{
"key" : "Tue",
"doc_count" : 1
}
]
}
}
}
在上面顯示,我們對一周內的每一天進行了統計。
在 index mapping 中使用
當然在很多的情況下,我們希望這個字段一直存在于索引的 mapping 中。這樣做的好處是,我們可以在 Kibana 中的可視化中直接使用被定義的 runtime fields。我們可以通過如下的方法來定義:
#Add the runtime field to the index mapping
PUT date_to_day/_mapping
{
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": """emit(doc['timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.SHORT, Locale.ROOT))"""
}
tgcode }
}
}
我們可以通過如下的命令來查看 date_to_day 索引的 mapping:
{
"date_to_day" : {
"mappings" : {
"runtime" : {
"day_of_week" : {
"type" : "keyword",
"script" : {
"source" : "emit(doc['timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.SHORT, Locale.ROOT))",
"lang" : "painless"
}
}
},
"properties" : {
"response_code" : {
"type" : "integer"
},
"timestamp" : {
"type" : "date",
"format" : "yyyy-MM-dd"
}
}
}
}
}
我們到 Kibana 的 index pattern 中去創建一個索引模式并查看它的字段定義:
從上面我們可以看出來一個新增加的 day_of_week 的字段。
我們可以在 Kibana 中直接使用這個字段并進行可視化:
當然,也許你懷疑是不是索引的 source 是否已經包含新生成的 day_of_week 字段,我們可以通過如下的命令來查看:
GET date_to_day/_search
上面的命令顯示:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "date_to_day",
"_type" : "_doc",
"_id" : "_iyDlXcBjSpwk8PH7vNz",
"_score" : 1.0,
"_source" : {
"response_code" : 200,
"timestamp" : "2021-01-01"
}
},
{
"_index" : "date_to_day",
"_type" : "_doc",
"_id" : "_yyDlXcBjSpwk8PH7vNz",
"_score" : 1.0,
"_source" : {
"response_code" : 300,
"timestamp" : "2021-01-03"
}
},
{
"_index" : "date_to_day",
"_type" : "_doc",
"_id" : "ACyDlXcBjSpwk8PH7vRz",
"_score" : 1.0,
"_source" : {
"response_code" : 200,
"timestamp" : "2021-01-04"
}
},
...
顯然,我們的 source 并沒有任何tgcode的改變。 day_of_week 只是 schema on read。
總結
以上是生活随笔為你收集整理的kibana java script_Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布 - TGCode...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么碰到异常跳过继续执行_Jav
- 下一篇: stm32 I2C架构