elasticsearch,replace,lucene,escaping,Python,elasticsearch,Replace,Lucene,Escaping" /> elasticsearch,replace,lucene,escaping,Python,elasticsearch,Replace,Lucene,Escaping" />

Python elasticsearch中的特殊字符转义

Python elasticsearch中的特殊字符转义,python,elasticsearch,replace,lucene,escaping,Python,elasticsearch,Replace,Lucene,Escaping,我正在使用对托管的elasticsearch实例进行一些查询 我注意到了。具体来说,这些 + - && || ! ( ) { } [ ] ^ " ~ * ? : \ 除了我已经想到的以外,还有没有一个干净的方法可以做到这一点?当然还有比做更干净的方法 term .replace("+", "\+") .replace("-", "\-") # ....etc 我希望有一个API调用可以使用,但在文档中找不到。这似乎是一个很常见的问题,应该有人来解决

我正在使用对托管的elasticsearch实例进行一些查询

我注意到了。具体来说,这些

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
除了我已经想到的以外,还有没有一个干净的方法可以做到这一点?当然还有比做更干净的方法

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 

是的,这些字符将需要在您要在中搜索的内容中替换。要做到这一点(假设您使用的是PyLucene),您应该能够使用

除此之外,您始终可以根据需要调整
QueryParserBase.escape
源代码:

公共静态字符串转义(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
我修改了我发现的代码:

escapeRules={'+':r'\+',
'-':r'\-',
“&”:r“\&”,
“|”:r“\|”,
“!”:r“\!”,
“(”:r“\(”,
“)”:r“\)”,
“{”:r“\{”,
“}”:r“\}”,
“[”:r“\[”,
']':r'\]',
“^”:r“\^”,
“~”:r“\~”,
“*”:r“\*”,
“?”:r“\?”,
“:”:r“\:”,
“'”:r“\”,
“\\”:r“\\;”,
“/”:r“\/”,
'>':r',

“为了直接回答这个问题,下面是一个使用
re.sub

import re
KIBANA_SPECIAL = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'.split(' ')
re.sub('([{}])'.format('\\'.join(KIBANA_SPECIAL)), r'\\\1', val)
但是,更好的解决方案是正确解析发送到elasticsearch的坏字符:

import six.moves.urllib as urllib
urllib.parse.quote_plus(val)

java代码起到了帮助作用。我将编辑以包含我的python答案,但这是正确的。当此条件为真时?``c=='\'“``@SavvaSergey虽然在这种情况下双引号的转义不是绝对必要的,但转义后的双引号仍将被视为普通的单字符双引号。请注意未来的读者:Elasticsearch还有其他需要转义的字符:(这是v2.3,请参考您部署的版本)请提供更多详细信息
import six.moves.urllib as urllib
urllib.parse.quote_plus(val)