solr query检索词特殊字符的转义处理

发布时间:2018-10-27作者:laosun阅读(1168)

solr

solr是基于 lucence开发的应用,如果query中带有非法字符串,结果很可能是检索出所有内容或者直接报错,所以你对用户的输入必须要先做处理。输入星号,能够检索出所有内容;输入加号,则会报错。

    最近博主在处理solr的时候,偶然发现了一个问题。就是特殊符号的搜索会抛出异常。

    异常信息如下:

    [ERROR][2018-10-27 14:11:46146]Error from server at XXXXXXXXXXXX: org.apache.solr.search.SyntaxError: Cannot parse 'title:http:sunjs.com OR digest:http:sunjs.com': Encountered " ":" ": "" at line 1, column 10.
    Was expecting one of:
        <EOF> 
        <AND> ...
        <OR> ...
        <NOT> ...
        "+" ...
        "-" ...
        <BAREOPER> ...
        "(" ...
        "*" ...
        "^" ...
        <QUOTED> ...
        <TERM> ...
        <FUZZY_SLOP> ...
        <PREFIXTERM> ...
        <WILDTERM> ...
        <REGEXPTERM> ...
        "[" ...
        "{" ...
        <LPARAMS> ...
        "filter(" ...
        <NUMBER> ...

    这种异常就是特殊符号所引起的,我们需要对齐进行转义处理

    官方的处理办法:

    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 == '/' || Character.isWhitespace(c)) {
    				sb.append('\\');
    			}
    			sb.append(c);
    		}
    		return sb.toString();
    	}

    翻译的php版本(利用preg_replace函数进行正则替换):

    static public function escape($value)
    {
        //list taken from http://lucene.apache.org/java/docs/queryparsersyntax.html#Escaping%20Special%20Characters
        $pattern = '/(\+|-|&|\||!|\(|\)|\{|}|\[|]|\^|"|~|\*|\?|:|;|~|\/)/';
        $replace = '\\\$1';
     
       return preg_replace($pattern, $replace, $value);
    }

    翻译后的python版本:

    import re
    def escape_solr(word):
        return re.sub('(\\\|\+|-|&|\|\||!|\(|\)|\{|}|\[|]|\^|"|~|\*|\?|:|;|/|\~)','\\\1', word )


    文章转载自:https://blog.csdn.net/wgw335363240/article/details/39889979

1 +1

版权声明

 Java  源码  solr

 请文明留言

0 条评论