function find(Search_Query_Interface $query, $resultStart, $resultCount) { $builder = new Search_Elastic_QueryBuilder(); $builder->setDocumentReader($this->createDocumentReader()); $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'] = ''; } $data['score'] = round($entry->_score, 2); 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 testMoreLikeThisThroughAbstraction() { $builder = new QueryBuilder(); $builder->setDocumentReader(function ($type, $object) { return array('object_type' => $type, 'object_id' => $object, 'contents' => 'hello world'); }); $q = new Search_Query(); $q->filterSimilar('wiki page', 'A'); $query = $builder->build($q->getExpr()); $this->assertEquals(array('bool' => array('must' => array(array('more_like_this' => array('fields' => array('contents'), 'like_text' => 'hello world', 'boost' => 1.0))), 'must_not' => array(array('bool' => array('must' => array(array("match" => array("object_type" => array("query" => "wiki page"))), array("match" => array("object_id" => array("query" => "A"))))))))), $query['query']); }
function store($name, Search_Expr_Interface $expr) { $builder = new Search_Elastic_QueryBuilder(); $builder->setDocumentReader($this->createDocumentReader()); $doc = $builder->build($expr); $this->connection->storeQuery($this->index, $name, $doc); }