kibana筛选数据
q:
kibana如何编写语句,过滤es日志晚上9点到第二个早上8点的数据,并且筛选出用户名,是已经去重的用户名
a:
在 Kibana 中使用 Elasticsearch 查询语言(如 Painless 脚本或 Kibana 的 Kuery 查询语言)来过滤特定时间段的数据并去重用户名,可以通过以下步骤实现。假设你的索引模式为 `my-index-*`,时间戳字段为 `@timestamp`,用户名字段为 `username`。
### 使用 Kibana 的 Discover 功能
1. **打开 Kibana 并导航到 Discover 页面**:
- 选择你要查询的索引模式(例如 `my-index-*`)。
2. **设置时间范围**:
- 在顶部的时间选择器中,选择一个合适的时间范围,例如 "Last 7 days" 或 "Last 24 hours",以便包含你感兴趣的时段。
3. **添加过滤条件**:
- 在搜索栏中输入以下 Kuery 查询语句,以过滤出晚上9点到第二天早上8点的数据:
```kuery
@timestamp >= 'now-1d/d+21h' and @timestamp < 'now/d+8h'
```
4. **添加字段**:
- 在表格视图中,添加 `username` 字段,以便查看用户名。
5. **去重用户名**:
- Kibana 的 Discover 功能本身不支持直接去重,但你可以使用 Visualize 或 Lens 来创建一个聚合图表,以显示去重后的用户名。
### 使用 Kibana 的 Visualize 功能
1. **打开 Kibana 并导航到 Visualize 页面**:
- 选择 "Create visualization"。
2. **选择图表类型**:
- 选择 "Data table" 或 "Terms" 图表类型。
3. **配置数据源**:
- 选择你的索引模式(例如 `my-index-*`)。
4. **设置时间范围**:
- 在顶部的时间选择器中,选择一个合适的时间范围,例如 "Last 7 days" 或 "Last 24 hours",以便包含你感兴趣的时段。
5. **添加过滤条件**:
- 在 "Filters" 部分,添加以下过滤条件:
- **Field**: `@timestamp`
- **Operator**: `>=`
- **Value**: `now-1d/d+21h`
- **And**
- **Field**: `@timestamp`
- **Operator**: `<`
- **Value**: `now/d+8h`
6. **配置聚合**:
- 选择 "Terms" 聚合类型。
- 选择 `username` 字段。
- 设置 "Size" 为一个合适的值,以便显示足够的用户名。
7. **应用并保存**:
- 应用配置并保存可视化。
### 使用 Kibana 的 Dev Tools
如果你更喜欢使用原始的 Elasticsearch 查询,可以在 Kibana 的 Dev Tools 中编写和执行以下查询:
```json
GET my-index-*/_search
{
"size": 0,
"query": {
"bool": {
"should": [
{
"range": {
"@timestamp": {
"gte": "now-1d/d+21h",
"lt": "now/d+8h"
}
}
},
{
"range": {
"@timestamp": {
"gte": "now/d+21h",
"lt": "now+1d/d+8h"
}
}
}
]
}
},
"aggs": {
"unique_usernames": {
"terms": {
"field": "username.keyword",
"size": 1000 // 根据需要调整大小
}
}
}
}
```
这个查询做了以下几件事情:
1. **`query` 部分**:使用 `bool` 查询中的 `should` 子句来过滤出晚上9点到第二天早上8点的数据。
2. **`aggs` 部分**:使用 `terms` 聚合来获取去重后的用户名。
通过这些方法,你可以在 Kibana 中有效地过滤和去重特定时间段内的用户名。