ES关键字查询-特殊符号
项目中ES关键字查询遇到的坑,本来如果在创建关键字字段的时候就应该限制一些特殊符号的输入的,比如限制只能输入字母下划线和数字这种,不用允许输入特殊符号(@,$,*...),结果项目经理不让,说是限制了不好。那就只能后台对这些特殊符号进行转义。ES的javaAPI里面是有转义方法的,如下:String keyword = "title+-&&||!(){}[]^\"~*?:\\";k
·
项目中ES关键字查询遇到的坑,本来如果在创建关键字字段的时候就应该限制一些特殊符号的输入的,比如限制只能输入字母下划线和数字这种,不用允许输入特殊符号(@,$,*...),结果项目经理不让,说是限制了不好。那就只能后台对这些特殊符号进行转义。
ES的javaAPI里面是有转义方法的,如下:
String keyword = "title+-&&||!(){}[]^\"~*?:\\";
keyword = QueryParser.escape(keyword);
可以看看QueryParser的escape方法是怎么实现的
/**
* Returns a String where those characters that QueryParser
* expects to be escaped are escaped by a preceding <code>\</code>.
*/
public static String escape(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// These characters are part of the query syntax and must be escaped
if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
|| c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
|| c == '*' || c == '?' || c == '|' || c == '&' || c == '/') {
sb.append('\\');
}
sb.append(c);
}
return sb.toString();
}
最后发现这些并不够用,于是我自己把它copy出来做了些补充,扩展了一些中文的字符进去
/**
* Returns a String where those characters that QueryParser
* expects to be escaped are escaped by a preceding <code>\</code>.
*/
public static String escape(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// These characters are part of the query syntax and must be escaped
if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
|| c == '^' || c == '[' || c == ']' || c == '"' || c == '{' || c == '}' || c == '~'
|| c == '*' || c == '?' || c == '|' || c == '&' || c == '/'|| c == '#'|| c == '@'
|| c == '('|| c == ')'|| c == '>'|| c == '<'|| c == '“'|| c == '”'|| c == '?'
|| c == '、'|| c == '.') {
sb.append('\\');
}
sb.append(c);
}
return sb.toString();
}
更让我纳闷的是中文的“:”,它居然会被当做英文的“:”来用了
不知道是不是我没用对,路过的同仁请指正。
更多推荐
已为社区贡献1条内容
所有评论(0)