/** * @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; }
/** * @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; }
/** * 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; }
/** * 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; }
/** * {@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; }
/** * 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; }