项目中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();
    }

更让我纳闷的是中文的“:”,它居然会被当做英文的“:”来用了

不知道是不是我没用对,路过的同仁请指正。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐