Elasticsearch中的动态查询和关键字问题

时间:2015-06-17 19:10:06

标签: python elasticsearch

我目前遇到问题,尝试在Elasticsearch中为Python构建动态查询。要进行查询,请使用Q中的elasticsearch_dsl短片。这是我试图实现的东西

...
s = Search(using=db, index="reestr")
condition = {"attr_1_":"value 1", "attr_2_":"value 2"} # try to build query from this
must = []
for key in condition:
    must.append(Q('match',key=condition[key]))

但实际上这导致了这种情况:

[Q('match',key="value 1"),Q('match',key="value 2")]

然而,我想要的是:

[Q('match',attr_1_="value 1"),Q('match',attr_2_="value 2")]

恕我直言,这个图书馆查询的方式无效。我认为这个语法:

Q("match","attrubute_name"="attribute_value")

功能更强大,可以做更多的事情,而不是这个:

Q("match",attribute_name="attribute_value")

似乎无法动态构建attribute_name。或者,当然,我可能不知道正确的方法。

1 个答案:

答案 0 :(得分:1)

假设, 过滤器 = {'condition1':['value1'],'condition2':['value3','value4']}

代码:

    filters = data['filters_data'] 

    must_and = list() # The condition that has only one value
    should_or = list() # The condition that has more than 1 value

    for key in filters:
        if len(filters[key]) > 1:
            for item in filters[key]:
                should_or.append(Q("match", **{key:item})) 
        else:       
            must_and.append(Q("match", **{key:filters[key][0]})) 

    q1 = Bool(must=must_and)
    q2 = Bool(should=should_or)

    s = s.query(q1).query(q2) 
    result = s.execute()

也可以使用terms,可以直接接受值列表,不需要复杂的for循环,

代码:

    for key in filters:
        must_and.append(Q("terms", **{key:filters[key]}))

    q1 = Bool(must=must_and)