public function search(array $query) { if (empty($query['body']['query']) && empty($query['body']['filter'])) { $query['body']['query'] = ['match_all' => []]; } $params = ['index' => $this->model->getIndex(), 'type' => $this->model->getType(), 'from' => Arr::get($query, 'from', 0), 'size' => Arr::get($query, 'size', 50), 'body' => $query['body']]; $collection = new ElasticsearchCollection(); $this->emitter->trigger(DALEvents::BEFORE_SEARCH, $params); $response = $this->client->search($params); $this->emitter->trigger(DALEvents::AFTER_SEARCH, $response); $collection->response($response); $from = (int) $params['from']; foreach ($response['hits']['hits'] as $hit) { $model = $this->model->createInstance(); $model->_score = $hit['_score']; $model->_position = $from++; $model->_exist = true; $model->fillByResponse($hit); $model->fillByInnerHits($hit); $collection->put($model->getId(), $model); } return $collection; }