如何在solr搜索中防止特殊字符

时间:2013-05-20 08:05:24

标签: solr

目前我已在我的项目中开发了solr搜索。搜索是工作。但是当我放置一些像([] white space)这样的特殊字符时,我得到了例外。

Caused by: org.apache.lucene.queryParser.ParseException: Cannot parse 'searchable:       ([])': Encountered " "]" "] "" at line 1, column 13.
 Was expecting one of:
 <RANGEIN_QUOTED> ...
 <RANGEIN_GOOP> ...

at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:211)
at org.apache.solr.search.LuceneQParser.parse(LuceneQParserPlugin.java:79)
at org.apache.solr.search.QParser.getQuery(QParser.java:143)
at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:105)
... 104 more

那么,我该如何处理这种情况呢。如何防止搜索框中的特殊字符。

4 个答案:

答案 0 :(得分:8)

Solr / Lucene使用某些字符进行某些操作,例如: + - ! (){} [] ^“〜*?:
您需要使用反斜杠转义特殊字符。查看Escape Special Characters

答案 1 :(得分:1)

使用ClientUtils.escapeQueryChars(..)。如果您需要另外包装特殊单词,请使用

private static String regexp = "(^|\\s)(AND|OR|TO|NOT)($|\\s)";
private static Pattern pattern = Pattern.compile(regexp);

public static String wrap(String string) {
    Matcher matcher = pattern.matcher(string);

    StringBuffer sb = new StringBuffer();

    while(matcher.find()) {
        StringBuffer result = new StringBuffer();
        if(matcher.start() > 0) {
            result.append(" ");
        }
        result.append("\"");
        result.append(matcher.group(2));
        result.append("\"");
        if(matcher.end() < string.length()) {
            result.append(" ");
        }
        matcher.appendReplacement(sb, Matcher.quoteReplacement(result.toString()));
    }
    matcher.appendTail(sb);

    return sb.toString();
}

答案 2 :(得分:0)

我通过实现ClientUtils.escapeQueryChars(q)解决了solr特殊字符的问题。对于空格,我实现了q.trim();现在我的问题还可以。

答案 3 :(得分:0)

我在searchterms

上专门搜索时遇到了一些问题
  • &安培;&安培; (双AND字符)
  • || (双管字符)

所以我在将搜索发送到solr之前将其删除。