elasticsearch Kibana是一个脚本字段,在数组中循环
我正在尝试使用metricbeat http模块来监视F5池 我向F5API发出请求并带回json,json保存到kibana。但是json包含一个池成员数组,我想数一数池成员的数目 建议是,这可以通过脚本字段来完成。但是,我无法获取用于检索数组的脚本。乙二醇
elasticsearch Kibana是一个脚本字段,在数组中循环,
elasticsearch,kibana,metricbeat,
elasticsearch,Kibana,Metricbeat,我正在尝试使用metricbeat http模块来监视F5池 我向F5API发出请求并带回json,json保存到kibana。但是json包含一个池成员数组,我想数一数池成员的数目 建议是,这可以通过脚本字段来完成。但是,我无法获取用于检索数组的脚本。乙二醇 doc['http.f5pools.items.monitor'].value.length() 在预览结果中返回,并添加相同的“附加字段”进行比较: [ { "_id": "rT7wdGsBXQSGm_pQoH6Y", "h
doc['http.f5pools.items.monitor'].value.length()
在预览结果中返回,并添加相同的“附加字段”进行比较:
[
{
"_id": "rT7wdGsBXQSGm_pQoH6Y",
"http": {
"f5pools": {
"items": [
{
"monitor": "default"
},
{
"monitor": "default"
}
]
}
},
"pool.MemberCount": [
7
]
},
如果我尝试
doc['http.f5pools.items']
或者类似的,我只是得到一个错误:
"reason": "No field found for [http.f5pools.items] in mapping with types []"
谷歌搜索表明doc构造不包含数组
doc['http.f5pools.items.ratio']
返回
{
"_id": "BT6WdWsBXQSGm_pQBbCa",
"pool.MemberCount": [
1,
1
]
},
--更新2
好的,如果字段中的字符串有不同的值,那么您将得到所有的值。如果它们是一样的,你只会得到一个。wtf?好的,解决了
因此,正如我发现的那样,数组被预过滤为只返回不同的值(ints的情况除外?)
解决方案是使用params.\u source
而不是doc[]
引述如下:
文档值是一个列式字段值存储,默认情况下在所有
除已分析的文本字段之外的字段
文档值只能返回“简单”字段值,如数字、日期、,
地理点、术语等,或这些值的数组(如果字段为
多值。它无法返回JSON对象
另外,添加空检查也很重要,如下所述:
缺少字段
如果字段为空,文档['field']将抛出错误
映射中缺少。在无痛状态下,可以先用
doc.containsKey('field')*用于保护对文档映射的访问。
不幸的是,无法检查字段的存在
在表达式脚本中的映射中
引述如下:
文档源实际上只是一个特殊的存储字段,可以
可以使用_source.field_name语法访问。_源已加载
作为贴图的贴图,因此可以访问对象字段中的属性
例如,_source.name.first
以一个例子回应您的评论:
这里的kyeword是:它不能返回JSON对象。字段doc['http.f5pools.items']是一个JSON对象
尝试在下面运行并查看它创建的映射:
PUT t5/doc/2
{
"items": [
{
"monitor": "default"
},
{
"monitor": "default"
}
]
}
GET t5/_mapping
{
"t5" : {
"mappings" : {
"doc" : {
"properties" : {
"items" : {
"properties" : {
"monitor" : { <-- monitor is a property of items property(Object)
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
}
}
PUT t5/doc/2
{
“项目”:[
{
“监视器”:“默认值”
},
{
“监视器”:“默认值”
}
]
}
获取t5/_映射
{
“t5”:{
“映射”:{
“文件”:{
“财产”:{
“项目”:{
“财产”:{
“监视器”:{我正在添加另一个答案,而不是删除我以前的答案,这不是实际问题,但将来可能对其他人有帮助
我在报告中发现了一个提示:
文档值是一个列式字段值存储
在谷歌上进一步搜索后,我发现了这样一个信息:doc值本质上是“未转换的索引”对于排序之类的操作很有用;我的假设是,在排序时,基本上不希望重复相同的值,因此它们使用的数据结构会删除这些重复项。这仍然无法解释为什么它对字符串和数字的作用不同。数字会被保留,但字符串会被过滤为唯一的
这种“未转换”的结构在其他语言中通常称为“列存储”
基本上,它存储单个字段的所有值
集中在一列数据中,这使得
像排序这样的操作
在Elasticsearch中,此列存储称为文档值,并且
默认情况下启用。文档值在索引时创建:当字段
索引后,Elasticsearch将标记添加到
搜索。但它也会提取术语并将其添加到专栏中
文档值
还有一些实际上是为了高效和内存友好的操作而使值加倍
上面的链接给出了一个注释,回答了这个问题:
你可能会想,“这对于数字来说很好,但是对于数字呢
字符串?“字符串在序数的帮助下进行类似的编码
表。字符串被消除重复并排序到一个表中,然后分配
一个ID,然后这些ID被用作数字文档值
字符串与数字具有许多相同的压缩优势
顺序表本身有一些压缩技巧,例如使用
固定、可变或前缀编码字符串
另外,如果你不希望出现这种行为,那么你可以如果有人能解释为什么我会接受你的回答是的,这取决于值和映射。是否进行了分析。答案都在文档中。你能给我指出文档中的一点吗,即当值为str时,数组将被预过滤为唯一值ing?它没有说那些确切的词,但它说它不能返回JSON对象。字段doc['http.f5pools.items']
是一个JSON对象。@Ewan还添加了一个示例。希望这能增加一些清晰度。我认为您没有抓住要点。我理解它不能返回对象。但它可以返回对象的字段作为数组。除非字段类型是字符串,它只返回不同的值,而不是您认为找到的所有值。请参阅关于kibana/Elastic的一些不直观的东西是的,这更多的是关于数据结构的部分,这不容易理解。但是很好知道。谢谢