在elasticsearch中转义特殊字符

2024-05-21

我正在使用Elasticsearch python 客户端 https://elasticsearch-py.readthedocs.io/en/master/对我们托管的 elasticsearch 实例进行一些查询。

我注意到一些字符需要转义 http://lucene.apache.org/core/3_4_0/queryparsersyntax.html#Escaping%20Special%20Characters。具体来说,这些...

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

除了我已经想到的之外,还有一种干净的方法可以做到这一点吗?当然有比这样做更干净的方法

term
    .replace("+", "\+")
    .replace("-", "\-")

    # ....etc

我希望有一个可以使用的 API 调用,但我在文档中找不到。这似乎是一个很常见的问题,应该由某人来解决。

有谁知道这样做的“正确”方法?

编辑:我仍然不确定是否有 API 调用,但我得到的东西足够简洁,足以让我满意。

def needs_escaping(character):                                                                                                                                                                                        

    escape_chars = {                                                                                                                                                                                               
        '\\' : True, '+' : True, '-' : True, '!' : True,                                                                                                                                                           
        '(' : True, ')' : True, ':' : True, '^' : True,                                                                                                                                                            
        '[' : True, ']': True, '\"' : True, '{' : True,                                                                                                                                                            
        '}' : True, '~' : True, '*' : True, '?' : True,                                                                                                                                                            
        '|' : True, '&' : True, '/' : True                                                                                                                                                                         
    }                                                                                                                                                                                                              
    return escape_chars.get(character, False)   


sanitized = ''
for character in query:                                                                                                                                                                                            

    if needs_escaping(character):                                                                                                                                                                                 
        sanitized += '\\%s' % character                                                                                                                                                                           
    else:                                                                                                                                                                                                      
        sanitized += character 

是的,这些字符需要在您要搜索的内容中替换query_string 查询 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html。为此(假设您正在使用 PyLucene),您应该能够使用QueryParserBase.escape(String) https://lucene.apache.org/core/6_2_0/queryparser/org/apache/lucene/queryparser/classic/QueryParserBase.html#escape-java.lang.String-.

除此之外,你总是可以调整QueryParserBase.escape源代码满足您的需求:

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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在elasticsearch中转义特殊字符 的相关文章

随机推荐