function find(Search_Query_Interface $query, $resultStart, $resultCount) { $builder = new Search_Elastic_QueryBuilder(); $queryPart = $builder->build($query->getExpr()); $builder = new Search_Elastic_OrderBuilder(); $orderPart = $builder->build($query->getSortOrder()); $builder = new Search_Elastic_FacetBuilder(); $facetPart = $builder->build($query->getFacets()); $fullQuery = array_merge($queryPart, $orderPart, $facetPart, array("from" => $resultStart, "size" => $resultCount, "highlight" => array("fields" => array('contents' => array("number_of_fragments" => 5))))); $result = $this->connection->search($this->index, $fullQuery, $resultStart, $resultCount); $hits = $result->hits; $entries = array_map(function ($entry) { $data = (array) $entry->_source; if (isset($entry->highlight->contents)) { $data['_highlight'] = implode('...', $entry->highlight->contents); } else { $data['_highlight'] = ''; } return $data; }, $hits->hits); $resultSet = new Search_Elastic_ResultSet($entries, $hits->total, $resultStart, $resultCount); $reader = new Search_Elastic_FacetReader($result); foreach ($query->getFacets() as $facet) { if ($filter = $reader->getFacetFilter($facet)) { $resultSet->addFacetFilter($filter); } } return $resultSet; }
function scroll(Search_Query_Interface $query) { $builder = new Search_Elastic_OrderBuilder(); $orderPart = $builder->build($query->getSortOrder()); $builder = new Search_Elastic_QueryBuilder(); $builder->setDocumentReader($this->createDocumentReader()); $queryPart = $builder->build($query->getExpr()); $indices = [$this->index]; $fullQuery = array_merge($queryPart, $orderPart, array("size" => 100, "highlight" => array("fields" => array('contents' => array("number_of_fragments" => 5), 'file' => array("number_of_fragments" => 5))))); $args = ['scroll' => '5m']; $result = $this->connection->search($indices, $fullQuery, $args); $scrollId = $result->_scroll_id; do { foreach ($result->hits->hits as $entry) { (yield (array) $entry->_source); } $result = $this->connection->scroll($scrollId, $args); } while (count($result->hits->hits) > 0); }