官方的处理办法(Java,因为solr是java开发的):
- https:
-
- public static String escapeQueryChars(String s) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
-
- if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
- || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
- || c == '*' || c == '?' || c == '|' || c == '&' || c == ';' || c == '/'
- || Character.isWhitespace(c)) {
- sb.append('\\');
- }
- sb.append(c);
- }
- return sb.toString();
- }
翻译的php版本(利用preg_replace函数进行正则替换):
- static public function escape($value)
- {
-
- $pattern = '/(\+|-|&|\||!|
|
|\{|}|\[|]|\^|"|~|\*|\?|:|;|~|\/)/';
- $replace = '\\\$1';
-
- return preg_replace($pattern, $replace, $value);
- }
翻译后的python版本:
- import re
- def escape_solr(word):
- return re.sub('(\\\|\+|-|&|\|\||!|
|
|\{|}|\[|]|\^|"|~|\*|\?|:|;|/|\~)','\\\1', word )
Solr在搜索的时候的做法是,将特殊字符移除掉,可以通过下面的方法
queryStr.replaceAll("\\pP|\\pS","");