List of all hits that are returned for a search on elasticsearch Result set implements iterator
Author: Nicolas Ruflin (spam@ruflin.com)
Inheritance: implements Iterator, implements Countable, implements ArrayAccess
 /**
  * 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;
 }
Example #6
0
 /**
  * @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();
 }
Example #10
0
 /**
  * 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;
 }
Example #12
0
 /**
  * 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;
 }
Example #16
0
 /**
  * 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);
 }
Example #17
0
 /**
  * @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());
 }
Example #18
0
 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;
 }
Example #19
0
 /**
  * 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;
 }