Example #1
0
 /**
  * @param RequestInterface $request
  * @return \Magento\Framework\DB\Ddl\Table
  * @throws \Exception
  */
 public function buildQuery(RequestInterface $request)
 {
     $searchIndex = $this->indexFactory->create()->load($request->getIndex());
     $weights = [];
     foreach ($searchIndex->getIndexInstance()->getAttributeWeights() as $attr => $weight) {
         $weights[$attr] = pow(2, $weight);
     }
     $indexName = $this->scopeResolver->resolve($request->getIndex(), $request->getDimensions());
     $sphinxQuery = $this->engine->getQuery()->select(['id', new QLExpression('weight()')])->from($indexName)->limit(0, 1000000)->option('max_matches', 1000000)->option('field_weights', $weights)->option('ranker', new QLExpression("expr('sum(word_count*user_weight) + bm25')"));
     //@todo http://habrahabr.ru/company/sphinx/blog/133790/
     $queryContainer = $this->queryContainerFactory->create(['request' => $request]);
     $sphinxQuery = $this->processQuery($request->getQuery(), $sphinxQuery, BoolQuery::QUERY_CONDITION_MUST, $queryContainer);
     $sphinxQuery = $this->addDerivedQueries($queryContainer, $sphinxQuery);
     $result = $sphinxQuery->execute();
     if (isset($_GET) && isset($_GET['debug'])) {
         echo $sphinxQuery->getCompiled();
         echo '<pre>' . print_r($result, true) . '</pre>';
     }
     $documents = [];
     foreach ($result as $item) {
         $document = $this->documentFactory->create([]);
         $document->setId($item['id'])->setCustomAttribute('entity_id', $item['id'])->setCustomAttribute('score', new DataObject(['value' => $item['weight()']]));
         $documents[] = $document;
     }
     $table = $this->temporaryStorage->storeApiDocuments($documents);
     return $table;
 }
Example #2
0
 /**
  * @param RequestInterface $request
  * @param Table $documentsTable
  * @return array
  */
 private function processAggregations(RequestInterface $request, Table $documentsTable)
 {
     $aggregations = [];
     $buckets = $request->getAggregation();
     $dataProvider = $this->dataProviderContainer->get($request->getIndex());
     foreach ($buckets as $bucket) {
         $aggregationBuilder = $this->aggregationContainer->get($bucket->getType());
         $aggregations[$bucket->getName()] = $aggregationBuilder->build($dataProvider, $request->getDimensions(), $bucket, $documentsTable);
     }
     return $aggregations;
 }
Example #3
0
 /**
  * Add filtering by dimensions
  *
  * @param RequestInterface $request
  * @param Select $select
  * @return \Magento\Framework\DB\Select
  */
 private function processDimensions(RequestInterface $request, Select $select)
 {
     $dimensions = $this->prepareDimensions($request->getDimensions());
     $query = $this->conditionManager->combineQueries($dimensions, Select::SQL_OR);
     if (!empty($query)) {
         $select->where($this->conditionManager->wrapBrackets($query));
     }
     return $select;
 }
Example #4
0
    /**
     * Add filtering by dimensions
     *
     * @param RequestInterface $request
     * @param Select $select
     * @return \Magento\Framework\DB\Select
     */
    private function processDimensions(RequestInterface $request, Select $select)
    {
        $dimensions = [];
        foreach ($request->getDimensions() as $dimension) {
            $dimensions[] = $this->dimensionsBuilder->build($dimension);
        }

        $query = $this->conditionManager->combineQueries($dimensions, Select::SQL_OR);
        if (!empty($query)) {
            $select->where($this->conditionManager->wrapBrackets($query));
        }

        return $select;
    }
Example #5
0
 /**
  * {@inheritdoc}
  */
 public function build(RequestInterface $request)
 {
     $searchIndexTable = $this->scopeResolver->resolve($request->getIndex(), $request->getDimensions());
     $select = $this->getSelect()->from(['search_index' => $searchIndexTable], ['entity_id' => 'entity_id'])->joinLeft(['tmp' => new \Zend_Db_Expr('(SELECT 1 as search_weight)')], '1=1', '');
     return $select;
 }
Example #6
0
 /**
  * Add filtering by dimensions
  *
  * @param RequestInterface $request
  * @param Select $select
  * @return \Magento\Framework\DB\Select
  */
 private function processDimensions(RequestInterface $request, Select $select)
 {
     $dimensions = [];
     foreach ($request->getDimensions() as $dimension) {
         $dimensions[] = $this->dimensionsBuilder->build($dimension);
     }
     if (!empty($dimensions)) {
         $query = sprintf('(%s)', implode(' ' . Select::SQL_OR . ' ', $dimensions));
         $select->where($query);
     }
     return $select;
 }