solr查询的时候报错,原因是关键词中存在特殊字符引起的
2021-08-27 13:42:33,274 [XNIO-2 task-1] ERROR o.a.s.c.solrj.impl.CloudSolrClient.requestWithRetryOnStaleState(CloudSolrClient.java:1167) - Request to collection iask-question failed due to (400) org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://xxxxxxxx:xxxx/solr/iask-question: org.apache.solr.search.SyntaxError: Cannot parse 'content: ': Encountered "<EOF>" at line 1, column 9.
Was expecting one of:
<BAREOPER> ...
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<LPARAMS> ...
"filter(" ...
<NUMBER> ...
, retry? 0
解决方法,在查询之前先把关键词转义一次
/**
* 过滤lucence的特殊字符
* lucence特殊字符有 + - && || ! ( ) { } [ ] ^ " ~ * ? : \ / 外加空格
* @param s
* @return
*/
public static String escapeQueryChars(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 == ' '){
continue;
}
sb.append(c);
}
//连续多个空格替换成1个空格 空格前面加斜杠
String result = sb.toString().replaceAll("\\s{1,}", "\\\\ ");
return result;
}