Итерация по ответу эластичного поиска и создание функции агрегирования в одном запросе ES - PullRequest
0 голосов
/ 25 марта 2019

У меня есть запросasticsearch, который возвращает 10 лучших результатов для данной строки запроса.Теперь мне нужно использовать ответ для создания агрегации суммы для каждого из 10 лучших результатов.Это мой запрос на возврат 10 лучших:

GET search/
{
  "index": "my_index",
  "query": {
    "match": {
      "name": {
        "query": "hello world",
        "fuzziness": 2
      }
    }
  }
}

. В ответ на вышеуказанный запрос я генерирую список из 10 org_id s и перебираю каждый из этих идентификаторов.Я должен сделать еще один запрос, используя запрос ниже (где "org_id": "12345" является первым элементом в моем массиве идентификаторов).

POST _search/my_index
{ "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "org_id": "12345"
          }
        }
      ]
    }
  },
  "aggs": {
      "aggregation_1": {
        "sum": {
          "field": "dollar_amount"
        }
      },
      "aggregation_2": {
        "sum": {
          "field": "employees"
        }
      }
    }
}

Однако я думаю, что этот подход неэффективен, потому что я должен сделатьВсего 11 запросов, которые не будут хорошо масштабироваться.В идеале я хотел бы сделать один запрос, который может сделать все это.

Есть ли какие-либо функциональные возможности в ES, которые сделали бы это возможным, или мне нужно было бы делать индивидуальные запросы для каждого параметра поиска?Я просмотрел документы и не могу найти ничего, что включало бы итерацию по массиву результатов.


РЕДАКТИРОВАТЬ: Для простоты, я думаю, что сейчас есть 2 запроса.Поэтому мне просто нужно выяснить, как пройти через массив org_ids во 2-й запрос и выполнить все агрегации в этом 2-м запросе.

Например,

POST _search/my_index
{ "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "org_id": ["12345", "67891", "98765"]
          }
        }
      ]
    }
  },
  "aggs": {
      "aggregation_1": {
        "sum": {
          "field": "dollar_amount"
        }
      },
      "aggregation_2": {
        "sum": {
          "field": "employees"
        }
      }
    }
}

1 Ответ

0 голосов
/ 25 марта 2019

Для начала вы можете агрегировать за один шаг (итого 2 запроса)

Я смотрю на размытость, но не вижу, как сделать одноразовый запрос.

Редактировать: ваш org_id уникален (= id документов?), Можете ли вы описать свои данные (как org_id связаны с запросом нечеткости)?

{ "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "org_id": "12 13 14 15 16 17 18...." 
          }
        }
      ]
    }
  },
  "aggs": {
    "group_org_id": {
      "terms": {
        "field": "org_id"
      }
    },
   "aggs": {
      "aggregation_1": {
        "sum": {
          "field": "dollar_amount"
        }
      },
      "aggregation_2": {
        "sum": {
          "field": "employees"
        }
      }
    }
} 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...