2016-06-03 7 views
1

Ich bin ziemlich neu in programing so meine Frage vielleicht dumm/einfach sein, aber zu tun: i mehrere Filter in Elasticsearch basierend auf BenutzereingabenElasticsearch/Python dynamische Anzahl von Filtern

mein Körper Abfrage erstellen müssen : dynamische Anzahl dieser Filter haben

body = { 
     "query": { 
      "filtered": { 
       "filter": { 
        "bool": { 
         "must": [ 
          {"term": {name1: value1}}, 
          {"term": {name2: value2}}, 
          {"term": {name3: value3}}, 
         ] 
        } 
       } 
      } 
     }, 
} 

und es funktioniert gut, aber ich brauche

ich versuchte Abfrage in Zeichenfolge zu bauen und dann Filter hinzufügen innen, aber es erlaubt nicht, dass es zum Beispiel:

l = [] 
for i_type, name in convert.items(): 
    string = '{"term": {"' + i_type + '":"' + name + '"}},' 
    l.append(string) 
i_query = ''.join(l) 

wenn ich Liste/string in im Abfragestruktur 404 Fehler vom Server bekommen

Ist es auch möglich, eine dynamische Anzahl von Filtern hinzufügen?

Antwort

0

Es ist möglich. Der Körper ist nur ein Python dictionary. So können Sie dynamisch Ihre Felder/Begriffe/neue Filter und so weiter hinzufügen.

body = { 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [] 
        } 
       } 
      } 
     } 
    } 

d = {"name_1": value_1, "name_2": value_2} 

Python 2.x

for key, value in d.iteritems(): 
    body1["query"]["filtered"]["filter"]["bool"]["must"].append({"term": {key: value}}) 

oder kürzer (Python 2.x):

body1["query"]["filtered"]["filter"]["bool"]["must"].extend([{"term": {key: value}} for key,value in d.iteritems()]) 

Python 3.x

for key, value in d.items(): 
    body1["query"]["filtered"]["filter"]["bool"]["must"].append({"term": {key: value}}) 

Die kürzere Version für Python 3.x:

body1["query"]["filtered"]["filter"]["bool"]["must"].extend([{"term": {key: value}} for key,value in d.items()]) 

Grundsätzlich können Sie beliebige Abfrage erstellen. Zum Beispiel können Sie einfach die Klausel hinzufügen:

body["query"]["filtered"]["filter"]["bool"]["should"]=[{"term": {"name_42": value_42}}] 
Verwandte Themen