Example #1
0
 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;
 }
Example #2
0
 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;
     }
 }
Example #3
0
 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);
 }
Example #4
0
 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;
 }
Example #5
0
 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;
 }
Example #6
0
 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);
 }