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