• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Elasticsearch:如何使 Elasticsearch 和 Kibana 中的文本字段可聚合?

武飞扬头像
Elasticsearch
帮助47

前言

我们知道文本字段是不可以进行聚合的。要想把该字段变成为可以进行聚合的字段,一种方法就是把它变成为 keyword 字段,这样就可以进聚合了,但是一旦我们把字段变为另外一种数据类型,那么我们首先失去了对该字段的全文搜索功能。我们只能对该字段进行精确的匹配。更为严重的是,我们必须使用 reindex 把该索引转变为另外一个索引。一种比较合理的解决方式就是使用 mulit-fields。我们可以在不改变索引 mappings 的情况下,增加一个新的 keyword 字段,从而达到能够实现聚合的目的。

如何检查字段是否可聚合?

要检查字段是否可聚合,请打开 Kibana,选择左侧菜单中的 Stack Management 选项,然后选择索引模式。 如果可聚合列下有复选/圆圈,则表示该字段已聚合。

> 

> 

>如何使字段可聚合? 

选择一个字段

首先,你需要选择一个字段。 对于此示例,我选择使用 message 字段,如下图所示,message 字段不可以被聚合,因为它是 text 类型的字段。

现在你需要找出这个特定 message 字段出现在什么索引模式下。 当你在索引模式页面上时,你将能够在页面顶部查看索引模式。 上例中使用了 Logstash-* 索引模式。

获取索引 template

第二部分需要使用 Kibana Dev Tools 部分。然后在 Dev Tools 部分运行以下命令。 你还可以使用 Elasticsearch API 获取模板,但在本示例中,你将使用 Kibana Dev Tools。

GET _cat/templates

这将返回当前在 Elasticsearch 和 Kibana 中的模板的名称。 我们需要找到我们需要的模板名称,比如 Logstash。 现在,在 Kibana Dev Tools 的新行上,你将运行以下命令。

GET _template/logstash

运行此命令将获取 Logstash 索引模板,如下所示。

`

1.  {
2.      "order" : 0,
3.      "version" : 60001,
4.      "index_patterns" : [
5.        "logstash-*"
6.      ],
7.      "settings" : {
8.        "index" : {
9.          "refresh_interval" : "5s"
10.        }
11.      },
12.      "mappings" : {
13.        "_default_" : {
14.          "dynamic_templates" : [
15.            {
16.              "message_field" : {
17.                "path_match" : "message",
18.                "match_mapping_type" : "string",
19.                "mapping" : {
20.                  "type" : "text",
21.                  "norms" : false,
22.                }
23.              }
24.            },
25.            {
26.              "string_fields" : {
27.                "match" : "*",
28.                "match_mapping_type" : "string",
29.                "mapping" : {
30.                  "type" : "text",
31.                  "norms" : false,
32.                  "fields" : {
33.                    "keyword" : {
34.                      "type" : "keyword",
35.                      "ignore_above" : 256
36.                    }
37.                  }
38.                }
39.              }
40.            }
41.          ],
42.          "properties" : {
43.            "@timestamp" : {
44.              "type" : "date"
45.            },
46.            "@version" : {
47.              "type" : "keyword"
48.            },
49.            "geoip" : {
50.              "dynamic" : true,
51.              "properties" : {
52.                "ip" : {
53.                  "type" : "ip"
54.                },
55.                "location" : {
56.                  "type" : "geo_point"
57.                },
58.                "latitude" : {
59.                  "type" : "half_float"
60.                },
61.                "longitude" : {
62.                  "type" : "half_float"
63.                }
64.              }
65.            }
66.          }
67.        }
68.      },
69.      "aliases" : { }
70.    }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

创建一个 keyword 字段

在上面的模板中找到 message 字段部分。 可以看到当前映射类型是文本,不能在文本字段类型上进行聚合。 你需要一个 keyword 字段类型才能聚合。

更改字段映射类型的最简单方法是输入新模板。 将上面的模板复制到文本编辑器中,并将 message_field 转换为 keyword。 你可以通过将下一个代码片段添加到message 字段来执行此操作。



1.  "fields" : {
2.      "keyword" : {
3.          "ignore_above" : 2048,
4.          "type" : "keyword"
5.      }
6.  }


message 字段映射现在应该如下所示:

`

1.  "mappings" : {
2.            "_default_" : {
3.              "dynamic_templates" : [
4.                {
5.                  "message_field" : {
6.                    "path_match" : "message",
7.                    "match_mapping_type" : "string",
8.                    "mapping" : {
9.                      "type" : "text",
10.                      "norms" : false,
11.                      "fields" : {
12.                        "keyword" : {
13.                          "type" : "keyword",
14.                          "ignore_above" : 2048
15.                        }
16.                      }
17.                    }
18.                  }
19.                },
20.  (mappings __default__ has been deprecated in version 7 and will appear as mappings _doc)

22.          "mappings" : {
23.            "_doc" : {
24.              "dynamic_templates" : [

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

您需要在 ignore_above 上设置合理的大小,以免影响性能。 大多数消息都小于 1500 个字符,但它们可能会增加。 在此示例中,你最多允许使用 2048 个字符,较长的消息将被忽略。

改变 template order

你还需要更改模板的顺序以确保它应用于 message 字段。 如果你将 order 号更改为 4,它将具有所有模板中最高的 order 号。 这意味着它将是应用的顶级模板。 order 在模板中的工作方式是首先应用最低的 order 号,而较高的 order 号位于其上。 因此,将首先应用订单号为 0 的模板,然后将应用订单号为 1 的模板,订单号为 4 的模板将位于这两个模板之上并作为顶级模板应用。 继续更改顺序,使其值为 4。



1.  PUT _template/logstash_msg_keyword
2.  {
3.      "order" : 4,
4.      "version" : 60001,
5.      "index_patterns" : [
6.        "logstash-*"


在 Kibana 中创建新的 template

复制新模板,因为它已准备好添加。 在将模板粘贴到 Kibana 之前。 你需要先将以下行添加到 Kibana Dev Tools 中。 这会告诉 Kibana 你将要输入一个新模板并将其命名为 logstash_msg_keyword。

PUT _template/logstash_msg_keyword

我们在 Kibana Dev Tools 中有一个新行粘贴新模板。 你应该有类似于以下部分的内容。

`

1.  PUT _template/logstash_msg_keyword
2.  {
3.      "order" : 4,
4.      "version" : 60001,
5.      "index_patterns" : [
6.        "logstash-*"
7.      ],
8.      "settings" : {
9.        "index" : {
10.          "refresh_interval" : "5s"
11.        }
12.      },
13.      "mappings" : {
14.        "_default_" : {
15.          "dynamic_templates" : [
16.            {
17.              "message_field" : {
18.                "path_match" : "message",
19.                "match_mapping_type" : "string",
20.                "mapping" : {
21.                  "type" : "text",
22.                  "norms" : false,
23.                  "fields" : {
24.                    "keyword" : {
25.                      "type" : "keyword",
26.                      "ignore_above" : 2048
27.                    }
28.                  }
29.                }
30.              }
31.            },
32.            {
33.              "string_fields" : {
34.                "match" : "*",
35.                "match_mapping_type" : "string",
36.                "mapping" : {
37.                  "type" : "text",
38.                  "norms" : false,
39.                  "fields" : {
40.                    "keyword" : {
41.                      "type" : "keyword",
42.                      "ignore_above" : 256
43.                    }
44.                  }
45.                }
46.              }
47.            }
48.          ],
49.          "properties" : {
50.            "@timestamp" : {
51.              "type" : "date"
52.            },
53.            "@version" : {
54.              "type" : "keyword"
55.            },
56.            "geoip" : {
57.              "dynamic" : true,
58.              "properties" : {
59.                "ip" : {
60.                  "type" : "ip"
61.                },
62.                "location" : {
63.                  "type" : "geo_point"
64.                },
65.                "latitude" : {
66.                  "type" : "half_float"
67.                },
68.                "longitude" : {
69.                  "type" : "half_float"
70.                }
71.              }
72.            }
73.          }
74.        }
75.      },
76.      "aliases" : { }
77.  }

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

发送带有未来日期的测试数据

模板应用于索引创建,因为数据很可能今天已经发送到 ELK 堆栈。 你需要使用未来的索引创建。 这可以通过使用将来的日期来实现,例如 1/1/2030。 然后,你可以使用 Stack API 密钥将数据从命令行发送到堆栈中。

curl -i -H "ApiKey: <your-stack-api-key" -i -H "Content-Type: application/json" https://localhost:9200 -d '{"message":"This is so cool", "@timestamp":"2030-11-08T11:00:0.000Z"}'

检验结果

一旦你确认数据已到达你的 Elasticsearch。 在 Kibana 上,你需要进入 Stack Management 选项卡,选择索引模式,刷新索引字段列表并搜索 message.keyword 字段,检查该字段现在是否可聚合。

应用于已有数据

之前的数据可能还没有 message.keyword 这个字段。我们可以通过如下的方式来更新之前的数据:

POST logstash-*/_update_by_query

这样我们之前的已有数据将会含有 message.keyword 这个字段。你将可以对它们进行聚合了。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanfbfee
系列文章
更多 icon
同类精品
更多 icon
继续加载