2016-10-24 198 views
0

elasticsearch python clientを使用して、私たちがホストしているelasticsearchインスタンスに対して何らかのクエリを実行しています。elasticsearchで特殊文字をエスケープする

私は気づいたsome characters need to be escaped。具体的には、これらは...

私が既に念頭に置いたことを超えてこれを行うためのクリーンな方法はありますか?確かにそこに私は、私が使用できるAPIの呼び出しがあった期待していた

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

    # ....etc 

を行うよりもきれいな方法ですが、私は、ドキュメント内の1つのを見つけることができません。これは誰かによって解決されているはずの十分な共通の問題のようです。

誰もがこれを行う "正しい"方法を知っていますか?

編集: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 
+0

ヘッド::Elasticsearchは、あまりにも、その上にエスケープする必要がある他の文字があります。https:/あなたは常にあなたのニーズにQueryParserBase.escapeソースコードを適応させることができ、ことをバーリング

/www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-query-string-query.html#_reserved_characters(これはv2.3で、配布したものを参照してください) – justderb

答えて

2

はい、これらの文字は、あなたがquery_string queryで検索するコンテンツ以内に交換する必要があります。これを行うには(PyLuceneを使用していると仮定して)、QueryParserBase.escape(String)を使用できるはずです。将来の読者のために、最大

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(); 
} 
+0

Javaコード助けてくれた。私は私のpythonの答えを含めるように編集するが、これは正しい軌道にあった。 – Zack

関連する問題