Skip to content

Commit

Permalink
Fix Smile-SA#14 - First implementation of the search API with ES.
Browse files Browse the repository at this point in the history
  • Loading branch information
Aurélien FOUCRET committed Mar 21, 2017
1 parent 09519ab commit 896ed7f
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 7 deletions.
149 changes: 149 additions & 0 deletions src/module-elasticsuite-core/Model/Search.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?php
/**
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade Smile Elastic Suite to newer
* versions in the future.
*
* @category Smile
* @package Smile\ElasticsuiteCore
* @author Romain Ruaud <romain.ruaud@smile.fr>
* @copyright 2016 Smile
* @license Open Software License ("OSL") v. 3.0
*/

namespace Smile\ElasticSuiteCore\Model;

/**
* SearchInterface implementation using elasticsuite.
*
* @category Smile
* @package Smile\ElasticsuiteCore
* @author Romain Ruaud <romain.ruaud@smile.fr>
*/
class Search implements \Magento\Framework\Api\Search\SearchInterface
{
/**
* @var \Smile\ElasticsuiteCore\Search\Request\Builder
*/
private $requestBuilder;

/**
* @var \Magento\Framework\App\ScopeResolverInterface
*/
private $scopeResolver;

/**
* @var \Magento\Search\Model\SearchEngine
*/
private $searchEngine;

/**
* @var \Magento\Framework\Search\SearchResponseBuilder
*/
private $searchResponseBuilder;

/**
* Constructor.
*
* @param \Magento\Framework\App\ScopeResolverInterface $scopeResolver
* @param \Magento\Search\Model\SearchEngine $searchEngine
* @param \Smile\ElasticsuiteCore\Search\Request\Builder $requestBuilder
* @param \Magento\Framework\Search\SearchResponseBuilder $searchResponseBuilder
*/
public function __construct(
\Magento\Framework\App\ScopeResolverInterface $scopeResolver,
\Magento\Search\Model\SearchEngine $searchEngine,
\Smile\ElasticsuiteCore\Search\Request\Builder $requestBuilder,
\Magento\Framework\Search\SearchResponseBuilder $searchResponseBuilder
) {
$this->requestBuilder = $requestBuilder;
$this->scopeResolver = $scopeResolver;
$this->searchEngine = $searchEngine;
$this->searchResponseBuilder = $searchResponseBuilder;
}


/**
* Execute search.
*
* @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria Search criteria.
*
* @return \Magento\Framework\Api\Search\SearchResultInterface
*/
public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
{
$searchRequest = $this->getSearchRequest($searchCriteria);
$searchResponse = $this->searchEngine->search($searchRequest);
$searchResult = $this->searchResponseBuilder->build($searchResponse);

$totalCount = $searchResponse->count();
$searchResult->setTotalCount($totalCount);
$searchResult->setSearchCriteria($searchCriteria);

return $searchResult;
}

/**
*
* @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
*
* @return \Smile\ElasticsuiteCore\Search\RequestInterface
*/
private function getSearchRequest(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
{
$request = $this->requestBuilder->create(
$this->scopeResolver->getScope()->getId(),
$searchCriteria->getRequestName(),
max(0, $searchCriteria->getPageSize() * ($searchCriteria->getCurrentPage() - 1)),
$searchCriteria->getPageSize(),
$this->getFulltextQuery($searchCriteria),
$this->getSortOrders($searchCriteria),
$this->getFilters($searchCriteria)
);

return $request;
}

/**
*
* @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
*
* @return NULL|string
*/
private function getFulltextQuery(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
{
$fulltextQuery = null;

foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
foreach ($filterGroup->getFilters() as $filter) {
if ($filter->getField() === 'search_term') {
$fulltextQuery = $filter->getValue();
}
}
}

return $fulltextQuery;
}

/**
*
* @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
*/
private function getSortOrders(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
{
$sort = [];
//@todo
return $sort;
}

/**
*
* @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria
*/
private function getFilters(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria)
{
$filters = [];
//@todo
return $filters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function buildQuery(QueryInterface $query)
throw new \InvalidArgumentException("Query builder : invalid query type {$query->getType()}");
}

$searchQuery = [];
$queryParams = [];

$clauses = [
self::QUERY_CONDITION_MUST,
Expand All @@ -52,21 +52,27 @@ public function buildQuery(QueryInterface $query)
[$this->parentBuilder, 'buildQuery'],
$this->getQueryClause($query, $clause)
);
$searchQuery[$clause] = array_filter($queries);
$queryParams[$clause] = array_filter($queries);
}

$searchQuery['minimum_should_match'] = $query->getMinimumShouldMatch();
$searchQuery['boost'] = $query->getBoost();
$queryParams['minimum_should_match'] = $query->getMinimumShouldMatch();
$queryParams['boost'] = $query->getBoost();

if ($query->isCached()) {
$searchQuery['_cache'] = true;
$queryParams['_cache'] = true;
}

if ($query->getName()) {
$searchQuery['_name'] = $query->getName();
$queryParams['_name'] = $query->getName();
}

return ['bool' => $searchQuery];
$searchQuery = ['bool' => $queryParams];

if (empty($queryParams['must']) && empty($queryParams['should']) && empty($queryParams['must_not'])) {
$searchQuery = ['match_all' => new \stdClass()];
}

return $query;
}

/**
Expand Down
4 changes: 4 additions & 0 deletions src/module-elasticsuite-core/etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@

<preference for="Smile\ElasticsuiteCore\Api\Search\SpellcheckerInterface"
type="Smile\ElasticsuiteCore\Search\Adapter\Elasticsuite\Spellchecker" />


<preference for="Magento\Search\Api\SearchInterface"
type="Smile\ElasticsuiteCore\Model\Search" />

<type name="Smile\ElasticsuiteCore\Search\Request\Query\Fulltext\QueryBuilder">
<arguments>
Expand Down

0 comments on commit 896ed7f

Please sign in to comment.