在弹性搜索中使用聚合时的多字段过滤器

Multiple field filter when using aggregation in elasticsearch

{
  "query":{
    "constant_score": {
      "filter": {
        "match":{
          "request_1":"rent"
        }
      }
    }
  },
  "aggs": {
    "s": {
      "terms": {
        "field": "serial_number"
      }
    }
  }
}

这是我的查询,效果很好。

我想在里面 filter.match 我想添加另一个字段,以便在满足两个过滤器时返回的结果上发生聚合。

我正在尝试做类似的事情:

{
  "query":{
    "constant_score": {
      "filter": {
        "match":{
          "request_1":"rent",
          "request_2":"check"
        }
      }
    }
  }
}

按照建议我试过了

{
  "query":{
    "constant_score": {
      "filter": [
        {
          "match":{
            "request_1":"rent"
        }
      },
      {
          "match":{
            "request_2":"check"
        }
      }
     ]
    }
  },
  "aggs": {
    "s": {
      "terms": {
        "field": "serial_number"
      }
    }
  }
}

输出错误:

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "unexpected token [START_ARRAY]",
        "line": 4,
        "col": 17
      }
    ],
    "type": "parsing_exception",
    "reason": "unexpected token [START_ARRAY]",
    "line": 4,
    "col": 17
  },
  "status": 400
}

这样我就可以从那些在 request_1 字段中只有 "rent" 并且在 request_2 字段中只有 "check" 的人那里得到聚合。我怎样才能做到这一点?

你需要这样做:

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "request_1": "rent"
          }
        },
        {
          "match": {
            "request_2": "check"
          }
        }
      ]
    }
  },
  "aggs": {
    "s": {
      "terms": {
        "field": "serial_number"
      }
    }
  }
}

在非常旧的 ES 版本(2.0 之前)上,您可以改用此查询:

{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "match": {
                "request_1": "rent"
              }
            },
            {
              "match": {
                "request_2": "check"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "s": {
      "terms": {
        "field": "serial_number"
      }
    }
  }
}