/** * @param \Mirasvit\Search\Model\Index\AbstractIndex $index * @return array */ private function generateQuickSearchRequest($index) { $request = []; $request['dimensions']['scope']['name'] = 'scope'; $request['dimensions']['scope']['value'] = 'default'; $request['query'] = $index->getCode(); $request['index'] = $index->getCode(); $request['from'] = '0'; $request['size'] = '100'; $request['filters'] = []; $request['aggregations'] = []; $code = $index->getCode(); $request['queries'][$code]['type'] = 'boolQuery'; $request['queries'][$code]['name'] = $code; $request['queries'][$code]['boost'] = 1; $request['queries'][$code]['queryReference'] = [['clause' => 'should', 'ref' => 'search_query']]; $request['queries']['search_query']['name'] = $index->getCode(); $request['queries']['search_query']['type'] = 'matchQuery'; $request['queries']['search_query']['value'] = '$search_term$'; $request['queries']['search_query']['match'][] = ['field' => '*', 'boost' => 10]; return $request; }
/** * Reindex all stores * * @return bool */ public function reindexAll() { $configData = ['fieldsets' => [], 'indexer_id' => $this->index->getCode()]; /** @var \Magento\CatalogSearch\Model\Indexer\IndexerHandler $indexHandler */ $indexHandler = $this->indexHandlerFactory->create(['data' => $configData]); $storeIds = array_keys($this->storeManager->getStores()); foreach ($storeIds as $storeId) { $dimension = new Dimension('scope', $storeId); $indexHandler->cleanIndex([$dimension]); $indexHandler->saveIndex([$dimension], $this->rebuildStoreIndex($storeId)); } $this->index->getModel()->setStatus(Config::INDEX_STATUS_READY)->save(); return true; }
/** * Join matches to collection * * @param AbstractDb $collection * @param string $field * * @return $this */ public function joinMatches($collection, $field = 'e.entity_id') { $requestBuilder = $this->requestBuilderFactory->create(); $queryText = $this->queryFactory->get()->getQueryText(); $requestBuilder->bind('search_term', $queryText); $requestBuilder->bindDimension('scope', $this->scopeResolver->getScope()); $requestBuilder->setRequestName($this->index->getCode()); $queryRequest = $requestBuilder->create(); $queryResponse = $this->searchEngine->search($queryRequest); $temporaryStorage = $this->temporaryStorageFactory->create(); if ($field == 'ID') { //external connection (need improve detection) $ids = [0]; foreach ($queryResponse->getIterator() as $item) { $ids[] = $item->getId(); } $collection->getSelect()->where(new \Zend_Db_Expr("{$field} IN (" . implode(',', $ids) . ")")); } else { $table = $temporaryStorage->storeDocuments($queryResponse->getIterator()); $collection->getSelect()->joinInner(['search_result' => $table->getName()], $field . ' = search_result.' . TemporaryStorage::FIELD_ENTITY_ID, []); } return $this; }