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 find(Search_Query_Interface $query, $resultStart, $resultCount) { try { $words = $this->getWords($query->getExpr()); $condition = $this->builder->build($query->getExpr()); $conditions = empty($condition) ? array() : array($this->table->expr($condition)); $scoreField = null; $indexes = $this->builder->getRequiredIndexes(); foreach ($indexes as $index) { $this->table->ensureHasIndex($index['field'], $index['type']); if (!$scoreField && $index['type'] == 'fulltext') { $scoreField = $index['field']; } } $this->table->flush(); $order = $this->getOrderClause($query, (bool) $scoreField); $selectFields = $this->table->all(); if ($scoreField) { $str = $this->db->qstr(implode(' ', $words)); $selectFields['score'] = $this->table->expr("ROUND(MATCH(`{$scoreField}`) AGAINST ({$str}),2)"); } $count = $this->table->fetchCount($conditions); $entries = $this->table->fetchAll($selectFields, $conditions, $resultCount, $resultStart, $order); $resultSet = new Search_ResultSet($entries, $count, $resultStart, $resultCount); $resultSet->setHighlightHelper(new Search_MySql_HighlightHelper($words)); return $resultSet; } catch (Search_MySql_QueryException $e) { $resultSet = new Search_ResultSet(array(), 0, $resultStart, $resultCount); return $resultSet; } }
function find(Search_Query_Interface $query, $resultStart, $resultCount) { $this->lastQuery = $query->getExpr(); $this->lastOrder = $query->getSortOrder(); $this->lastStart = $resultStart; $this->lastCount = $resultCount; return new Search_ResultSet(array(), 0, $resultStart, $resultCount); }
function find(Search_Query_Interface $query, $resultStart, $resultCount) { $expr = $query->getExpr(); $data = $this->internalFind($expr, $query->getSortOrder()); $result = array_slice($data['result'], $resultStart, $resultCount); $resultSet = new Search_ResultSet($result, count($data['result']), $resultStart, $resultCount); $resultSet->setEstimate($data['count']); if ($this->highlight) { $resultSet->setHighlightHelper(new Search_Lucene_HighlightHelper($expr)); } else { $resultSet->setHighlightHelper(new Search_ResultSet_SnippetHelper()); } return $resultSet; }
function scroll(Search_Query_Interface $query) { $expr = $query->getExpr(); $data = $this->internalFind($expr, $query->getSortOrder()); $resultCount = count($data['result']); $resultSet = new Search_ResultSet($data['result'], $resultCount, 0, $resultCount); 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); }