/** * Returns the number of results. * * @return integer The number of results. */ public function getNbResults() { if (!$this->resultSet) { return $this->searchable->search($this->query)->getTotalHits(); } return $this->resultSet->getTotalHits(); }
/** * @return int */ public function count() { if (null === $this->resultSet) { $this->search(); } return $this->resultSet->getTotalHits(); }
/** * @param \Elastica\ResultSet $searchResult * @param array $requestParameters * * @return array */ protected function formatSearchResult(ResultSet $searchResult, array $requestParameters) { $products = []; foreach ($searchResult->getResults() as $document) { $products[] = $document->getSource()[PageIndexMap::SEARCH_RESULT_DATA]; } return $products; }
/** * @param \Elastica\ResultSet $searchResult * @param array $requestParameters * * @return \Generated\Shared\Transfer\PaginationSearchResultTransfer */ protected function formatSearchResult(ResultSet $searchResult, array $requestParameters) { $paginationConfig = $this->getFactory()->getSearchConfig()->getPaginationConfigBuilder(); $itemsPerPage = $paginationConfig->getCurrentItemsPerPage($requestParameters); $maxPage = ceil($searchResult->getTotalHits() / $itemsPerPage); $currentPage = min($paginationConfig->getCurrentPage($requestParameters), $maxPage); $paginationSearchResultTransfer = new PaginationSearchResultTransfer(); $paginationSearchResultTransfer->setNumFound($searchResult->getTotalHits())->setCurrentPage($currentPage)->setMaxPage($maxPage)->setCurrentItemsPerPage($itemsPerPage); return $paginationSearchResultTransfer; }
/** * @param \Elastica\ResultSet $resultSet * * @return array */ public function extractProductIdsFromResultSet(ResultSet $resultSet) { $abstractProductIds = []; foreach ($resultSet->getResults() as $result) { $product = $result->getSource(); if (isset($product[PageIndexMap::SEARCH_RESULT_DATA]['id_product_abstract'])) { $abstractProductIds[] = $product[PageIndexMap::SEARCH_RESULT_DATA]['id_product_abstract']; } } return $abstractProductIds; }
/** * @param ResultSet $resultSet * @return string[] */ private function getSuggests(ResultSet $resultSet) { $originalSuggests = $resultSet->getSuggests(); $termSuggests = $originalSuggests['termSuggest']; /** @var string[] $suggests */ $suggests = []; foreach ($termSuggests as $termSuggest) { foreach ($termSuggest['options'] as $options) { $suggests[] = $options['text']; } } return $suggests; }
/** * @param \Elastica\ResultSet $searchResult * @param array $requestParameters * * @return array */ protected function formatSearchResult(ResultSet $searchResult, array $requestParameters) { $facetData = []; $facetConfig = $this->getFactory()->getSearchConfig()->getFacetConfigBuilder(); $aggregations = $searchResult->getAggregations(); foreach ($facetConfig->getAll() as $facetName => $facetConfigTransfer) { $fieldName = $facetConfigTransfer->getFieldName(); if (!isset($aggregations[$fieldName])) { continue; } $extractor = $this->getFactory()->createAggregationExtractorFactory()->create($facetConfigTransfer); $aggregation = $this->getAggregationRawData($aggregations, $facetConfigTransfer); $facetData[$facetName] = $extractor->extractDataFromAggregations($aggregation, $requestParameters); } return $facetData; }
public function testPartialFailure() { $client = $this->_getClient(); $index = $client->getIndex('elastica_partial_failure'); $index->create(array('index' => array('number_of_shards' => 5, 'number_of_replicas' => 0)), true); $type = $index->getType('folks'); $type->addDocument(new Document('', array('name' => 'ruflin'))); $type->addDocument(new Document('', array('name' => 'bobrik'))); $type->addDocument(new Document('', array('name' => 'kimchy'))); $index->refresh(); $query = Query::create(array('query' => array('filtered' => array('filter' => array('script' => array('script' => 'doc["undefined"] > 8')))))); try { $index->search($query); $this->fail('PartialShardFailureException should have been thrown'); } catch (PartialShardFailureException $e) { $resultSet = new ResultSet($e->getResponse(), $query); $this->assertEquals(0, count($resultSet->getResults())); } }
/** * * @param mixed $query * @param $fullResult (default = false) By default only the total hit count is returned. If set to true, the full ResultSet including facets is returned. * @return int|ResultSet */ public function count($query = '', $fullResult = false) { $this->setOptionsAndQuery(null, $query); $query = $this->getQuery(); $path = $this->getPath(); $response = $this->getClient()->request($path, Request::GET, $query->toArray(), array(self::OPTION_SEARCH_TYPE => self::OPTION_SEARCH_TYPE_COUNT)); $resultSet = new ResultSet($response, $query); return $fullResult ? $resultSet : $resultSet->getTotalHits(); }
/** * Turn the elasticsearch results into a collection of models. * * @param ResultSet $resultSet * @return Collection */ protected function resultsToModels(ResultSet $resultSet) { $results = $resultSet->getResults(); if (!empty($results)) { $groupedResults = $this->groupResultsByType($results); $modelResults = $this->getModelsFromGroupedResults($groupedResults); $collection = $this->newCollection($modelResults); return $collection; // return $collection->sortByDesc(function ($model) { // return $model->score; // }); } return $this->newCollection([]); }
/** * getNextPage * * @param ResultSet $results * @param int $from * @access private * @return int */ private function getNextPage(ResultSet $results) { $query = $results->getQuery(); $from = $query->hasParam('from') ? $query->getParam('from') : 0; $size = $query->hasParam('size') ? $query->getParam('size') : 10; $hits = $results->getTotalHits(); if (count($results) == 0 && $from > 0) { $msg = 'current page is higher than max page'; throw new NoMoreResultException($msg); } elseif ($hits > $from + $size) { if ($size > 0) { $nextPage = (int) $from / $size + 2; } else { $nextPage = 2; } } else { $nextPage = null; } return $nextPage; }
/** * Get a list of the models for the result set * * @param ResultSet $resultSet * @return array */ public function getModels(ResultSet $resultSet) { // Loop through the search hits and return Eloquent models for them $items = []; $hits = $resultSet->getResults(); foreach ($hits as $hit) { $itemArray = $hit->getSource(); $item = new Item(); $item->id = intval($hit->getId()); if (array_key_exists('url', $itemArray)) { $item->itemable = new Link(); $item->itemable->url = $itemArray['url']; $item->itemable->photo = $itemArray['photo']; } else { $item->itemable = new Note(); } $item->value = $itemArray['value']; $item->description = $itemArray['description']; $tagsArray = json_decode($itemArray['tags'], true); $item->tags = []; if ($tagsArray) { $tagsObjArray = []; foreach ($tagsArray as $tag) { $tagObj = new Tag(); $tagObj->name = $tag; $tagsObjArray[] = $tagObj; } $item->tags = $tagsObjArray; } $item->user_id = $itemArray['user_id']; $item->user = new User(); $item->user->id = $itemArray['user_id']; $item->user->user_photo = $itemArray['user_photo']; $items[] = $item; } return $items; }
/** * @param ResultSet $result * @return bool */ protected function collectAggregations(ResultSet $result) { if (!$result->hasAggregations()) { return false; } $this->aggregations = $result->getAggregations(); return true; }
/** * Return the count of hits returned, may not necessarily equal total hits. * * @return int */ public function count() { return $this->elasticaResultSet->count(); }
/** * @param ResultSet $result * * @return bool */ protected function collectFacets(ResultSet $result) { if (!$result->hasFacets()) { return false; } // Collect all facets $this->facets = $result->getFacets(); return true; }
/** * More like this query based on the given object * * The id in the given object has to be set * * @param \Elastica\Document $doc Document to query for similar objects * @param array $params OPTIONAL Additional arguments for the query * @param string|array|\Elastica\Query $query OPTIONAL Query to filter the moreLikeThis results * @return \Elastica\ResultSet ResultSet with all results inside * @link http://www.elastic.co/guide/en/elasticsearch/reference/current/search-more-like-this.html */ public function moreLikeThis(Document $doc, $params = array(), $query = array()) { $path = $doc->getId() . '/_mlt'; $query = Query::create($query); $response = $this->request($path, Request::GET, $query->toArray(), $params); return ResultSet::create($response, $query); }
/** * @group functional */ public function testBodyReuse() { $client = $this->_getClient(); $index = $client->getIndex('elastica_body_reuse_test'); $index->create(array(), true); $this->_waitForAllocation($index); $type = $index->getType('test'); $type->addDocument(new Document(1, array('test' => 'test'))); $index->refresh(); $resultSet = $index->search(array('query' => array('query_string' => array('query' => 'pew pew pew')))); $this->assertEquals(0, $resultSet->getTotalHits()); $response = $index->request('/_search', 'POST'); $resultSet = new ResultSet($response, Query::create(array())); $this->assertEquals(1, $resultSet->getTotalHits()); }
protected function buildInsertQuery(\Elastica\ResultSet $resultSet, $queryId) { $writeAdapter = $this->_getWriteAdapter(); $query = 'INSERT'; $query = sprintf('%s INTO %s', $query, $writeAdapter->quoteIdentifier($this->getTable('catalogsearch/result'))); $fields = ['query_id', 'product_id', 'relevance']; $columns = array_map(array($writeAdapter, 'quoteIdentifier'), $fields); $columns = implode(',', $columns); $query .= ' (' . $columns . ')'; $query .= ' VALUES'; $valueRows = []; foreach ($resultSet->getResults() as $result) { $productId = $result->getData()['entity_id'][0]; $values = [(int) $queryId, (int) $productId, (double) $result->getScore()]; $valueRows[] = '(' . implode(', ', $values) . ')'; } $query .= ' ' . implode(', ', $valueRows); $update = array(); foreach ($fields as $field) { $update[] = sprintf('%1$s = VALUES(%1$s)', $writeAdapter->quoteIdentifier($field)); } if ($update) { $query = sprintf('%s ON DUPLICATE KEY UPDATE %s', $query, join(', ', $update)); } return $query; }
/** * Prepares query response. * * @param \Elastica\ResultSet $response * @return array */ protected function _prepareQueryResponse($response) { /* @var $response \Elastica\ResultSet */ if (!$response instanceof \Elastica\ResultSet || $response->getResponse()->hasError() || !$response->count()) { return array(); } $this->_lastNumFound = (int) $response->getTotalHits(); $result = array(); foreach ($response->getResults() as $doc) { $result[] = $this->_toArray($doc->getSource()); } return $result; }