如何在elasticsearch-dsl-py中使用变量作为过滤条件的键?
使用elasticsearch-dsl Python API时将变量作为过滤器的键
这个问题其实是Python关键字参数的特性导致的——你直接把变量名写在关键字参数位置时,Python会把它当作字符串键,而不是去取变量的值。不过有两种简单的方法解决这个问题:
方法1:使用字典解包传递动态键
你可以先创建一个以变量值为键的字典,然后用**操作符把字典解包成过滤器的关键字参数:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Search es_client = Elasticsearch(['http://10.220.3.40'], port='9200') param1 = 'xyz' key_variable_name = 'Key2' # 构建动态键的字典 term_dict = {key_variable_name: param1} # 用**解包字典作为filter的参数 s = Search(using=es_client, index="index1", doc_type="sampledoc").filter("term", **term_dict) print("Query 2 :"+str(s.to_dict()))
这样生成的查询里,term过滤器的键就会是Key2,而不是变量名key_variable_name了。
方法2:使用Q对象构建动态查询
elasticsearch-dsl的Q对象专门用来构建灵活的查询条件,同样可以结合字典解包实现动态键:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Search, Q es_client = Elasticsearch(['http://10.220.3.40'], port='9200') param1 = 'xyz' key_variable_name = 'Key2' # 用Q对象创建term查询,动态指定键 q = Q("term", **{key_variable_name: param1}) # 将Q对象加入查询(也可以用filter代替query) s = Search(using=es_client, index="index1", doc_type="sampledoc").filter(q) print("Query with Q :"+str(s.to_dict()))
这种方法在构建复杂动态查询时会更方便,比如需要组合多个条件的时候。
为什么原代码不行?
Python的关键字参数是静态解析的,当你写.filter("term", key_variable_name=param1)时,Python会把key_variable_name直接当作字符串键名,而不会去读取变量key_variable_name的值。用字典解包则可以绕过这个限制,因为字典的键是动态生成的变量值,解包后就会成为对应的关键字参数。
内容的提问来源于stack exchange,提问作者Soumen
相关产品推荐
相关产品推荐

