kibana java script_Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布 - TGCode...
在之前的文章 “Elasticsearch:使用 Runtime fields 對(duì)索引字段進(jìn)行陰影處理以修復(fù)錯(cuò)誤 – 7.11 發(fā)布”,我展示了如何使用 runtime field 來 shadow 一個(gè)已有的在 mapping 中的字段,比如 duration。在今天的練習(xí)中,我將展示如何創(chuàng)建一個(gè)嶄新的字段并進(jìn)行數(shù)據(jù)的統(tǒng)計(jì)。在這里請(qǐng)注意的是:新增加的 runtime field 并不在 source 中添加,而只是在查詢時(shí)生成的,也即 schema on read。
在接下來的練習(xí)中,它包含創(chuàng)建 runtime field 的演示,其中從包含日期的時(shí)間戳字段中計(jì)算星期幾。 然后使用索引字段和新創(chuàng)建的 runtime field 在 Kibana Lens 中創(chuàng)建可視化文件。 Runtime field 是在 Elasticsearch 中讀取時(shí)為 schema 的實(shí)現(xiàn)提供的名稱。
展示
我們先來創(chuàng)建一個(gè) index mapping:
#Create the index mapping
PUT date_to_day
{
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd"
},
"response_code": {
"type": "integer"
}
}
}
}
在上面,我們展示了兩個(gè)字段: timestamp 以及 response_code。由于有一個(gè)時(shí)間戳,我們可以從這個(gè)時(shí)間戳中導(dǎo)出時(shí)間所在的 day of week,也就是星期幾。這個(gè)對(duì)于我們想對(duì)一周的每一天統(tǒng)計(jì)非常有用。
我們通過如下的 bulk API 來導(dǎo)入數(shù)據(jù):
#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"}
由于我們想對(duì)一周內(nèi)的每一天來進(jìn)行統(tǒng)計(jì)。一種辦法是重新建立一個(gè)新的 mapping。在這個(gè)新的 mapping 里包含這個(gè) day of week 的定義。并在數(shù)據(jù)導(dǎo)入之前我們對(duì)數(shù)據(jù)進(jìn)行處理。在實(shí)際的使用中,面對(duì)大量的已有數(shù)據(jù),這樣的處理可能非常費(fèi)力。我們可以使用 runtime field 來完成想要的功能。
在搜索請(qǐng)求時(shí)使用
由于 runtime field 是動(dòng)態(tài)生成的,它需要計(jì)算機(jī)來進(jìn)行處理。在很多的時(shí)候,我們并不想修改 mapping 來完成。我們只想針對(duì)一些搜索來進(jìn)行生成這個(gè) runtime field,或者只是作為在修改 mapping 前的一個(gè)練習(xí)來驗(yàn)證 runtime field 的正確性。我們使用如下的命令來生產(chǎn)這類的 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"
}
}
}
}
在上面的命令中,我們可以仔細(xì)閱讀這個(gè)部分:
"runtime_mappings": {
"day_of_week": {
"type": "keyword",
"script": {
"source": """emit(doc['timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.SHORT, Locale.ROOT))"""
}
}
},
這個(gè)不是是使用 script 來生成一個(gè)叫做 day_of_week 的 runtime 字段。而這個(gè)字段只存在于這個(gè)搜索中。在執(zhí)行完這個(gè)搜索后,這字段將自動(dòng)消失。這個(gè) day_of_week 字段是根據(jù) timestamp 導(dǎo)引出來的,是之前的 mapping 中完全沒有的字段。
上面命令的執(zhí)行結(jié)果為:
{
"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
}
]
}
}
}
在上面顯示,我們對(duì)一周內(nèi)的每一天進(jìn)行了統(tǒng)計(jì)。
在 index mapping 中使用
當(dāng)然在很多的情況下,我們希望這個(gè)字段一直存在于索引的 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 中去創(chuàng)建一個(gè)索引模式并查看它的字段定義:
從上面我們可以看出來一個(gè)新增加的 day_of_week 的字段。
我們可以在 Kibana 中直接使用這個(gè)字段并進(jìn)行可視化:
當(dāng)然,也許你懷疑是不是索引的 source 是否已經(jīng)包含新生成的 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。
總結(jié)
以上是生活随笔為你收集整理的kibana java script_Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布 - TGCode...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么碰到异常跳过继续执行_Jav
- 下一篇: Linux mysql.plugin_L