2016-06-03 2 views
1

Я довольно новыми для программирования, так что мой вопрос может быть глупый/легко сделать, но: мне нужно создать несколько фильтров в elasticsearch на основе пользовательского вводаElasticSearch/Python динамический ряд фильтров

мое тело запроса :

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

и это отлично работает, но мне нужно иметь динамическое число этих фильтров

Я пытался построить запрос в строку, а затем добавить фильтры внутри, но эс Dont позволяет это, например:

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

, когда я использовать список/строку в запросе структуры им получить 404 ошибки от сервера

ли даже можно добавить динамическое количество фильтров?

ответ

0

Это возможно. Тело - это просто Python dictionary. Таким образом, вы можете динамически добавлять свои поля/термины/новые фильтры и так далее.

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}}) 

Или короче (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}}) 

Чем короче версия для Python 3.x:

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

В принципе, вы можете создать любой запрос, который вы хотите. Например, вы можете легко добавить , если:

body["query"]["filtered"]["filter"]["bool"]["should"]=[{"term": {"name_42": value_42}}] 
Смежные вопросы