Фильтр с несколькими полями при использовании агрегации вasticsearch - PullRequest
0 голосов
/ 06 ноября 2019
{
  "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и "проверить" в поле request_2. Как мне это сделать?

1 Ответ

1 голос
/ 06 ноября 2019

Вам нужно сделать это следующим образом:

{
  "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"
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...