经常用Kibana搜索日志,发现一个很神奇的问题,kibana对数字的支持不是很好(准确的说是Elastic Search),如果你需要根据一串数字去搜索日志,那可能会让你失望,无法匹配的正确的结果。哪怕是字母加数字的组合,也不行。
于是我想到写日志时,把数字转换为英文字符,这样建立一个映射关系,搜索的时候使用映射出来的字符串,这样不就可以解决问题了嘛?Kibana对字符串搜索的支持非常好。直接上代码:
<?php
class NumberMagic
{
const PRE = 'CPRE'; // 前缀,可自定义
// 转换成小写字符
public static function toLowerStr($input)
{
$string = self::toStr($input);
return strtolower($string);
}
// 转换成大写字符
public static function toUpperStr($input)
{
$string = self::toStr($input);
return strtoupper($string);
}
// 核心方法
protected static function toStr($input)
{
$map = [
0 => 'A',
1 => 'B',
2 => 'C',
3 => 'D',
4 => 'E',
5 => 'F',
6 => 'G',
7 => 'H',
8 => 'I',
9 => 'J',
];
$string = self::PRE . $input; // 转换为字符串
for ($i = 0; $i < strlen($string); $i++) {
if (is_numeric($string[$i])) {
$key = $string[$i];
$string[$i] = $map[$key];
}
}
return $string;
}
}
$input = "werrewrer234324234324234";
$result = NumberMagic::toLowerStr($input);
echo $result;
上面的代码实现很简单,首先我定义了一个数字到英文字母的映射表,然后遍历传入的字符串,如果发现有数字,就把数字替换为对应的字母。 这样就曲线救国的解决了日志搜索的问题~~