Zac*_*ack 6 python lucene replace escaping elasticsearch
我正在使用elasticsearch python 客户端对我们托管的elasticsearch 实例进行一些查询。
我注意到有些字符需要转义。具体来说,这些...
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
Run Code Online (Sandbox Code Playgroud)
除了我已经想到的之外,还有一种干净的方法可以做到这一点吗?当然有比这样做更干净的方法
term
.replace("+", "\+")
.replace("-", "\-")
# ....etc
Run Code Online (Sandbox Code Playgroud)
我希望有一个可以使用的 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
Run Code Online (Sandbox Code Playgroud)
是的,这些字符需要在您想要在query_string 查询中搜索的内容中替换。为此(假设您使用的是 PyLucene),您应该能够使用QueryParserBase.escape(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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
30241 次 |
最近记录: |