我目前遇到问题,尝试在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
。或者,当然,我可能不知道正确的方法。
答案 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)