kibana做图表无法选取需要选的字段

Kibana字段索引问题

http://www.07net01.com/2015/12/1069635.html


kibana做图表无法选取需要选的字段,即通过term的方式过滤选择某一个field时发现列表里无此选项。

wKiom1aFAWuSYiPXAAAaSCMrdEo742.gif

 

再去discover里看,发现此字段前面带有问号,点击后提示这个字段未做索引,不能用于visualize和discover的搜索。

思考:

从源头查起,日志是logstash收集上来的,猜想可能原因是logstash需要按照某些规则添加这个索引,于是把目光聚焦到logstash的filter

这里我用的是grok,猜测是不是在message匹配后需要再用add_field添加才行。

尝试:

添加add_field后发现不行(确切的说是我add_field用的不太好,写的不对),然后百度相关grok格式发现,不需要添加add_field即可把字段作搜索使用。

尝试失败。

再思考:

排除logstash,后面就是elasticsearch了,这个本身基本未做改动,排除,再就是kibana,突然想到看看之间写的tomcat错误堆栈日志字段是否能正常可搜索,查看发现其日志字段时可以用的,反过头再去比对了下logstash底层发现两者写法和patterns定义均无区别,到了这里基本可以确定为kibana的设置问题了。

尝试:

查阅官方文档kibana相关配置位置,尝试查看了setting,果然发现在index里找到了相关项:

wKiom1aFAW-j0Bx7AADa7MWGOTM207.gif

刷新后字段就被索引上了,相当于在kibana中如果索引建立后,再通过logstash添加新字段时,需要在这边刷新以更新状态。

之后便可正常使用此字段了。

至此问题解决。

本文出自 “苍穹KILL” 博客,请务必保留此出处http://1645027.blog.51cto.com/1635027/1730540



<think>我们是在Kibana中进行可视化,要求两个字段乘积的和。 在Kibana中,我们可以使用聚合来实现。具体来说,我们可以使用脚本化度量(Scripted Metric)或者使用运行时字段(Runtime Field)结合Sum聚合。 但是,由于我们需要计算两个字段乘积的和,这实际上是一个点积(dot product)运算。 步骤: 1. 在Kibana中创建可视化(如数据表、指标等)。 2. 使用聚合方式,择“Sum of Products”或者通过脚本来实现。 然而,Kibana本身并没有直接提供两个字段乘积求和的聚合。因此,我们可以采用以下两种方法之一: 方法一:使用运行时字段(Runtime Field) - 创建一个运行时字段,其值为两个字段的乘积,然后对该运行时字段进行求和。 方法二:使用脚本化度量聚合(Scripted Metric Aggregation) - 在脚本化度量聚合中,我们可以编写脚本来遍历所有文档,计算每个文档两个字段的乘积,然后累加。 由于在Kibana的可视化界面中,我们通常使用“Lens”或者“Aggregation based”的可视化(如Data Table),这里我们分别说明。 注意:在Kibana 7.12及以上版本中,支持了运行时字段,这可能是更简单的方法。 方法一(运行时字段)步骤: 1. 在索引模式中创建运行时字段(或者在Discover中创建临时运行时字段): 名称:product 类型:Double 脚本:emit(doc['field1'].value * doc['field2'].value) 2. 然后在可视化中,使用Sum聚合,对运行时字段product进行求和。 方法二(脚本化度量聚合)步骤(在可视化类型为“Metric”或“Data Table”中使用): 1. 创建一个新的聚合,择类型为“Scripted Metric”。 2. 在脚本中编写代码,初始化一个变量(如sum),在每一份文档中计算乘积并累加,最后返回总和。 下面我们以方法一(运行时字段)为例,因为其更简单且性能较好(如果数据量很大,运行时字段在查询时计算,可能会影响性能,但实现简单)。 但是,如果是在Elasticsearch中直接查询,我们可以使用以下聚合: ```json { "aggs": { "total_product": { "sum": { "script": { "source": "doc['field1'].value * doc['field2'].value" } } } } } ``` 在Kibana中,我们可以在可视化构建器中择“Sum”聚合,然后使用脚本: 步骤(在Aggregation based可视化中,如Data Table): 1. 添加一个聚合,择“Sum”。 2. 在字段择的地方,择“Scripted Field”(或者直接输入脚本)。 3. 输入脚本:`doc['field1'].value * doc['field2'].value` 4. 注意:确保field1和field2是数值类型,否则需要转换。 但是,在Kibana的Lens可视化中(更直观): 1. 进入Lens。 2. 在数据面板中,点击“Add field”。 3. 择“Create a field”,输入名称(如product),然后输入公式:`field1 * field2`(注意:Lens的运行时字段支持Painless脚本,但也可以使用表达式,较新版本支持公式)。 4. 创建后,在图表择该字段,然后择聚合函数为“Sum”。 具体操作可能因Kibana版本而异。 由于问题中没有指定具体版本,我们以较新的版本(支持Lens和运行时字段)为例。 因此,总结如下: 在Kibana中计算两个字段乘积的和: 1. 创建一个运行时字段,计算两个字段的乘积。 2. 在可视化中,对该运行时字段使用Sum聚合。 注意:如果数据量很大,考虑在索引中预先计算并存储这个乘积字段,以提高性能。 示例(在Discover中创建运行时字段,然后在可视化中使用): 步骤1:进入Discover,择索引模式。 步骤2:点击“Add a field”,输入名称(如product),类型择Double,然后输入脚本: ```groovy if (doc['field1'].size()>0 && doc['field2'].size()>0) { def f1 = doc['field1'].value; def f2 = doc['field2'].value; return f1 * f2; } else { return 0; } ``` 或者更简单(如果字段都存在): ```groovy emit(doc['field1'].value * doc['field2'].value); ``` 注意:在运行时字段中,使用emit函数(在Kibana中创建运行时字段时,脚本格式可能有所不同,有些版本使用return,有些版本使用emit。在Kibana7.12+中,创建运行时字段的脚本是使用return的,而不使用emit。具体请参考版本文档。) 在Kibana 7.12及以上版本中,创建运行时字段的脚本格式如下: ```groovy return doc['field1'].value * doc['field2'].value; ``` 步骤3:保存运行时字段(可以是临时的,也可以是保存到索引模式中)。 步骤4:进入可视化,择该索引模式,然后添加一个Metric或者Data Table可视化。 步骤5:添加一个聚合,择“Sum”,字段择刚刚创建的运行时字段“product”。 这样,就可以得到两个字段乘积的和。 注意:如果字段是整数,需要确保乘法不会溢出,如果字段可能是null,则需要进行处理。 因此,我们推荐使用运行时字段的方法。 如果是在Lens中: 1. 打开Lens,择索引模式。 2. 在左侧的字段列表中,点击“Add field”。 3. 输入名称(如product),然后输入公式:`field1 * field2`(如果支持公式的话,否则使用上面的脚本方式)。 4. 在图表配置中,将“product”字段拖到指标区域,并择聚合函数为“Sum”。 注意:在Lens中,如果使用公式,可以直接输入表达式。 因此,根据Kibana版本择合适的方式。 如果版本较旧(不支持运行时字段),则需要在查询时使用脚本聚合,即在可视化中直接使用脚本。 在“Metric”可视化中: 1. 创建Metric可视化,择索引模式。 2. 点击“Add metric”,择“Custom metric”。 3. 在“Custom metric”中择“Scripted metric”。 4. 在脚本中编写代码(注意:脚本化度量聚合有四个阶段:init, map, combine, reduce)。 脚本化度量聚合的示例脚本: ```groovy // 初始化 state.products = 0.0; // 每份文档执行 return { map: (doc, state) => { state.products += doc['field1'].value * doc['field2'].value; }, combine: (state) => state.products, reduce: (states) => states.reduce((a, b) => a + b, 0) } ``` 但是,在Kibana的可视化构建器中,脚本化度量聚合的编写较为复杂,且容易出错,因此推荐使用运行时字段的方法。 综上所述,我们优先采用运行时字段方法。 最后,注意:如果两个字段中有一个是空值,那么乘积会变成0?或者需要跳过?这取决于业务需求。在脚本中,我们可以处理空值,例如: ```groovy if (doc['field1'].size()==0 || doc['field2'].size()==0) { return 0; } else { return doc['field1'].value * doc['field2'].value; } ``` 因此,根据实际需求调整。 在Kibana中实现两个字段乘积的和,核心是使用脚本计算每个文档的乘积,然后求和。 由于问题要求使用中文回答,并且需要在最后提出3-5个相关问题,下面将按照格式输出。</think># Kibana 可视化:计算两个字段乘积的总和 在 Kibana 中计算两个字段乘积的总和,可以通过以下两种主要方法实现: ## 方法一:使用运行时字段(Runtime Field) ```json PUT /your_index/_mapping { "runtime": { "product": { "type": "double", "script": { "source": "emit(doc['field1'].value * doc['field2'].value)" } } } } ``` 1. **创建可视化**: - 进入 KibanaVisualize → Create visualization - 择 "Lens" 可视化类型 - 择包含数据的索引模式 2. **配置聚合**: - 在 "Data" 面板中,择 "product" 运行时字段 - 设置聚合类型为 "Sum" - 将结果添加到可视化中 ## 方法二:使用脚本化指标聚合(Scripted Metric Aggregation) ```json POST /your_index/_search { "size": 0, "aggs": { "total_product": { "scripted_metric": { "init_script": "state.products = 0.0", "map_script": """ double field1 = doc['field1'].value; double field2 = doc['field2'].value; state.products += field1 * field2; """, "combine_script": "return state.products", "reduce_script": "double sum = 0; for (s in states) { sum += s } return sum" } } } } ``` ### 在 Kibana 可视化中配置: 1. 创建新的可视化 2. 择 "Metric" 类型 3. 添加新的聚合: - 类型:Scripted Metric - 使用上述脚本配置 4. 保存并查看结果 ## 使用 Lens 直接计算(Kibana 7.12+) 1. 打开 Lens 可视化 2. 点击 "Add field" → "Create field" 3. 输入公式:`field1 * field2` 4. 命名新字段(如 "product") 5. 在可视化中: - 择 "product" 字段 - 设置聚合为 "Sum" - 添加到可视化 ## 最佳实践建议: 1. **性能考虑**: - 对于大数据集,优先使用运行时字段 - 在索引中预计算乘积字段(如使用 Elasticsearch Ingest Pipeline) 2. **错误处理**: - 添加空值检查:`if (doc['field1'].size() > 0 && doc['field2'].size() > 0)` - 处理非数值类型:`Double.parseDouble(doc['field1'].value.toString())` 3. **可视化优化**: - 使用 "Data Table" 显示每个文档的乘积值 - 添加 "Sum" 指标作为最终结果 - 结合时间序列分析展示乘积变化趋势 ## 示例场景: 假设有字段: - `price`(价格) - `quantity`(数量) 计算总销售额:`sum(price * quantity)` **结果展示**: ``` 总销售额: $12,450.75 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值