python - elasticsearch dsl python解压缩q查询

标签 python elasticsearch elasticsearch-dsl elasticsearch-dsl-py q-query

如何在elasticsearch dsl python中动态创建组合的Q查询?
我已经过了docs和这个SO post。我用所有必需的信息构造了一个q_query字典。

ipdb> q_queries
{'queries': [{'status': 'PASS'}, {'status': 'FAIL'}, {'status': 'ABSE'}, {'status': 'WITH'}], 'operation': 'or'}
我想执行以下q_query
qq=Q("match", status='PASS') | Q("match", status="FAIL") | Q("match", status="ABSE") | Q("match", status="WITH")
列出下面的字典
ipdb> [Q('match', **z) for z in q_queries['queries']]
[Match(status='PASS'), Match(status='FAIL'), Match(status='ABSE'), Match(status='WITH')]
但是如何将多个Q与or运算符或an and运算符组合?另外,上述对应的elasticsearch raw query是什么?我尝试以下操作,因为我必须基于test_id进行过滤。
{
  "query": {
    "bool": {
      "must":     [
        { "match": { "test_id": "7" }},
        {
          "range": {
            "created": {
              "gte": "2016-01-01",
              "lte": "2016-01-31"
            }
          }
        }
        ],
      "should": [
                  { "match": { "status": "PASS"}},
                  { "match": { "status": "FAIL"}}
      ]
    }
  }
}
但是,如果没有should filter,我的查询结果将与预期的不同,并且获得的结果是相同的。因此,在我的情况下,过滤器不应由elasticsearch执行。
任何帮助深表感谢。
TIA

最佳答案

在探索了Elasticsearch dsl python一段时间之后,this piece of documentation帮助我解决了上述问题。下面发布的是我为解决此问题而编写的函数。

def create_q_queries(self, q_queries, search_query):
    """
    create q queries and chain if multiple q queries.
    :param q_queries: Q queries with operation and query params as a dict.
    :param search_query: Search() object.
    :return: search_query updated with q queries.
    """
    if q_queries:
        logical_operator_mappings = {'or': 'should', 'and': 'must'}
        for query in q_queries:
            queries = [Q('match', **query) for query in query['queries']]
            search_query = search_query.query(Q('bool', **{
                logical_operator_mappings.get(query.get('operation')): queries
            }))
    return search_query  

我更改了q_queries的格式,以根据andor等多个运算符执行链接。
q_queries = [
              {
                "operation": "or",
                "queries":
                  [
                    {"status": "PASS"}, {"status": "FAIL"}, {"status": "ABSE"}, {"status": "WITH"}
                  ]
                }

             ]

关于python - elasticsearch dsl python解压缩q查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43138089/

相关文章:

Python - 使用线程或队列迭代调用函数的 for 循环

python - 根据索引列表更改列表元素

elasticsearch - 使用Docker配置Elasticsearch和Kibana

python - 使用python在elasticsearch-dsl中聚合一个字段

elasticsearch - Elasticsearch何时确定文档的索引?

python - Elasticsearch bool 型面返回错误的类型

Python 调用 request() 到不指向 netrc 的 SSL 站点

python - Mac OS X 下 python 2.6 上的 Unicode 文件名

elasticsearch - 在Elasticsearch中提升结果

elasticsearch - 在Elasticsearch中嵌套查询?