ElasticSearch / Python动态过滤器数量

时间:2016-06-03 15:23:01

标签: python elasticsearch elasticsearch-plugin

我对编程很陌生,所以我的问题可能很愚蠢/容易做到但是: 我需要根据用户输入在elasticsearch中创建多个过滤器

我的查询主体:

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

它工作正常,但我需要动态数量的这些过滤器

我尝试将查询构建到字符串中,然后在里面添加过滤器,但不允许它,例如:

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

当我在查询结构中使用list / string时,我从服务器获取404错误

是否可以添加动态数量的过滤器?

1 个答案:

答案 0 :(得分:1)

有可能。正文只是一个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()])

基本上,您可以创建所需的任何查询。例如,您可以轻松添加 should 子句:

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