需要统计15分钟之前10183.modelName字段的值为"订单处理完成"的数量

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为1018310183.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字符串类型

最后修改:2019 年 07 月 22 日 06 : 06 PM