如何使用python在一个弹性搜索查询中进行Range和Match查询?

时间:2018-03-29 12:59:25

标签: python elasticsearch pyelasticsearch

我必须找到具有字符串的匹配文档,例如:" sky",在某些" key"范围。当我编写单独的匹配和范围查询时,我从ES获得输出,但它在合并时抛出异常。

范围查询:

res = es.search(index="dummy",
                body={"from":0, "size":0,"query": {"range":{"key":{"gte":"1000"}}}})

匹配查询:

res = es.search(index="dummy",
                body={"from":0, "size":0,"query": {"match":{"word":"sky"}}})

合并查询:

res = es.search(index="dummy",
                body={
                  "from":0,
                  "size":0,
                  "query": {
                    "range":{
                      "key":{"gte":"1000"}
                    }
                  },
                  "match":{"word":"sky"}
                })

执行时的组合查询会引发错误:

  

引发HTTP_EXCEPTIONS.get(status_code,TransportError)(status_code,error_message,additional_info)   elasticsearch.exceptions.RequestError:TransportError(400,u' parsing_exception',u' [匹配]中START_OBJECT的未知密钥。')

合并两个查询的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

您需要使用bool/must查询

这样做
res = es.search(index="dummy", body={
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "key": {
              "gte": "1000"
            }
          }
        },
        {
          "match": {
            "word": "sky"
          }
        }
      ]
    }
  }
})