kibana中es的watcher配置如下
{
"trigger": {
"schedule": {
"interval": "2m"
}
},
"input": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
"tarsclient-applog-*"
],
"types": [],
"body": {
"_source": {
"includes": "__none__"
},
"query": {
"bool": {
"must": [
{
"range": {
"log_date": {
"gte": "now-15m",
"lte": "now+1m"
}
}
},
{
"term": {
"level": "error"
}
}
]
}
},
"aggs": {
"appids": {
"terms": {
"field": "appid.keyword",
"size": 100
}
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gte": 0
}
}
},
"actions": {
"call_notifier": {
"webhook": {
"scheme": "http",
"host": "172.16.2.70",
"port": 7000,
"method": "post",
"path": "/notifier/api/notify",
"params": {},
"headers": {
"Content-Type": "application/json"
},
"body": "{\"meta\":{\"execution_time\":\"{{ctx.execution_time}}\",\"alert_name\":\"applog_error\",\"url\":\"http://kibana.sudo.homedo.com/app/kibana#/dashboard/68c759c0-a9e9-11e9-b414-111fafac2ecc\",\"title\":\"(测试)过去15分钟应用出现错误日志\"}, \"appids\":{{#toJson}}ctx.payload.aggregations.appids.buckets{{/toJson}}}"
}
}
}
}
之前都是使用单一term,现在需要两个过滤条件 appid为10183
和 10183.modelmodelName为 订单处理完成
抽取es搜索部分的语句
在query的中使用must类型,must表示AND的意思
GET _search
{
"query": {
"bool": {
"must": [
{
"range": {
"log_date": {
"gte": "now-15m",
"lte": "now+1m"
}
}
},
{
"term": {
"appid": "10183"
}
},
{"term": {"10183.modelName": "订单处理完成"}}
]
}
},
"aggs": {
"appids": {
"terms": {
"field": "appid.keyword",
"size": 100
}
}
}
}
这样查找发现查找不到,
{
"took": 396,
"timed_out": false,
"_shards": {
"total": 266,
"successful": 266,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
},
"aggregations": {
"appids": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
}
偶然看到一篇博客有人踩过相同的坑
踩坑链接中他也是搜索的中文字符串,使用java客户端调用es的api,也是搜索不到,
需要在字段后添加.keyword就能正常查询
正确的语句
GET _search
{
"query": {
"bool": {
"must": [
{
"range": {
"log_date": {
"gte": "now-15m",
"lte": "now+1m"
}
}
},
{
"term": {
"appid": "10183"
}
},
{
"match": {
"10183.modelName.keyword": "订单处理完成"
}
}
]
}
},
"aggs": {
"appids": {
"terms": {
"field": "10183.modelName.keyword",
"size": 1000
}
}
}
}
搜索的结果
keyword和text比较
ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。
Text
- 会分词,然后进行索引
- 支持模糊、精确查询
- 不支持聚合
keyword:
- 不进行分词,直接索引
- 支持模糊、精确查询
- 支持聚合
由此猜测可能是搜索字符串中含有中文,经测试带有""和".“等特殊字符串使用term的搜索也不行,需要在字段后面加上.keyword才能正确搜索
并且在kibana中搜索时,观察下搜索结果的颜色标注 能看到特殊字符被es切词了,说明在kibana搜索栏应该是使用的text字符串类型
...