"size": 0,
"query": {
"bool": {
"aggs": {
"result": {
"terms": {
"script": {
"lang": "painless",
"size": 2,
"source": "def m = /^\\/controller\\/action.+?s=(.+?)&.*?$/.matcher(doc['nginx.access.url'].value);\nif (m.matches()) {\n String s = m.group(1);\n boolean needToChange = false;\n int numChars = s.length();\n StringBuilder sb = new StringBuilder();\n int i = 0;\n\n char c;\n byte[] bytes = null;\n\n String vv = \"+%\";\n byte vNum1 = (byte)vv.charAt(0);\n byte vNum2 = (byte)vv.charAt(1);\n while (i < numChars) {\n c = s.charAt(i);\n byte cNum = (byte)c;\n if (cNum == vNum1) {\n sb.append(' ');\n i++;\n needToChange = true;\n } else if (cNum == vNum2) {\n if (bytes == null) {\n bytes = new byte[(numChars - i) / 3];\n }\n int pos = 0;\n\n String hexString = \"\";\n int countHex = 0;\n while (((i + 2) < numChars) && ((byte)c == vNum2)) {\n int v = Integer.parseInt(s.substring(i + 1, i + 3), 16);\n hexString += s.substring(i + 1, i + 3);\n countHex += 1;\n if (3 == countHex) {\n int num = Integer.parseInt(hexString, 16);\n String bitString = Integer.toString(num, 2);\n String unicodeString = \"\";\n if ((num & 0xf0000000L) > 0) {\n unicodeString = bitString.substring(5, 8) + bitString.substring(10, 16) + bitString.substring(18, 24) + bitString.substring(26, bitString.length());\n } else if ((num & 0xe00000) > 0) {\n unicodeString = bitString.substring(4, 8) + bitString.substring(10, 16) + bitString.substring(18, bitString.length());\n } else if ((num & 0xc000) > 0) {\n unicodeString = bitString.substring(3, 8) + bitString.substring(10, bitString.length());\n } else {\n unicodeString = bitString.substring(1, bitString.length());\n }\n char result = (char)Integer.parseInt(unicodeString, 2);\n sb.append(result);\n\n hexString = \"\";\n countHex = 0;\n }\n bytes[pos++] = (byte)v;\n i += 3;\n if (i < numChars) {\n c = s.charAt(i);\n }\n }\n\n needToChange = true;\n } else {\n sb.append(c);\n i++;\n }\n }\n\n String ret = needToChange ? sb.toString() : s;\n return ret.toUpperCase();\n} else {\n return \"N/A\";\n}"
{
“took”: 2600,
“timed_out”: false,
“_shards”: {
“total”: 278,
“successful”: 278,
“skipped”: 276,
“failed”: 0
},
“hits”: {
“total”: 476944,
“max_score”: 0,
“hits”: []
},
“aggregations”: {
“results”: {
“doc_count_error_upper_bound”: 1419,
“sum_other_doc_count”: 359784,
“buckets”: [
{
“key”: “秋以为期”,
“doc_count”: 6514
},
{
“key”: “原野苍茫”,
“doc_count”: 4704
}
]
}
}
}
java.net.URLDecoder.decode()
方法(原有方法中 new String()
构造函数 ElasticSearch 只支持无参的形式,因此需要手工进行从字节数组转为 Unicode 字符)- https://blog.csdn.net/hezh1994/article/details/78899683
- https://www.elastic.co/guide/en/elasticsearch/painless/6.7/painless-api-reference.html
Java 实现 URL Decode背景:ElasticSearch 自定义脚本当中可以支持 Java 的部分 API,但没有对 URLDecode 的支持,而分析用户搜索当中需要对 URL 进行 Decode因而需要自己实现public class MyURLDecode { public static void main(String[] args) { St...
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc
(很常见的一个乱码问题就要出现了,如果
如果不懂
字符编码问题,请参考 这篇文章。
在最新的Python 3版本中,
字符串是以
Unicode编码的,也就是说,Python的
字符串支持多语言,例如:
>>> print('包含中文的str')
包含中文的str
对于单个
字符的编码,Python提供了ord()函数获取
字符的整数表示,chr()函数把编码
转换为对应的
字符:
file_put_contents() 函数并不会将字节数组中的每个元素转换成对应的字符。这个函数只是将数据写入到文件中,并不会对数据进行转换。如果你想要将字节数组中的数据转换成字符串,你需要使用相应的函数或方法来实现。
例如,你可以使用 iconv() 函数将字节数组转换成字符串,例如:
$str = iconv('UTF-8', 'GBK', $bytes);
也可以使用 mb_convert_encoding() 函数来实现类似的功能:
$str = mb_convert_encoding($bytes, 'GBK', 'UTF-8');
你还可以使用 utf8_decode() 函数将 UTF-8 编码的字节数组转换成字符串:
$str = utf8_decode($bytes);
需要注意的是,转换字节数组为字符串时需要指定字符编码,因为不同的字符编码使用的字节序列是不同的。