/** * Run the query against ElasticSearch. * * @return array */ public function search() { $result = array(); Varien_Profiler::start('ES:ASSEMBLE:QUERY'); $query = $this->_assembleQuery(); Varien_Profiler::stop('ES:ASSEMBLE:QUERY'); $eventData = new Varien_Object(array('query' => $query, 'query_type' => $this->getQueryType())); Varien_Profiler::start('ES:ASSEMBLE:QUERY:OBSERVERS'); Mage::dispatchEvent('smile_elasticsearch_query_assembled', array('query_data' => $eventData)); Varien_Profiler::stop('ES:ASSEMBLE:QUERY:OBSERVERS'); $query = $eventData->getQuery(); if ($this->getConfig('enable_debug_mode')) { Mage::log(json_encode($query), Zend_Log::DEBUG, 'es-queries.log'); } Varien_Profiler::start('ES:EXECUTE:QUERY'); $response = $this->getClient()->search($query); Varien_Profiler::stop('ES:EXECUTE:QUERY'); if (!isset($response['error'])) { $result = array('total_count' => $response['hits']['total'], 'faceted_data' => array(), 'docs' => array(), 'ids' => array()); foreach ($response['hits']['hits'] as $doc) { $result['docs'][] = $doc['fields']; $result['ids'][] = (int) current($doc['fields']['entity_id']); } if (isset($response['facets'])) { foreach ($this->_facets as $facetName => $facetModel) { $currentFacet = clone $facetModel; if ($facetModel->isGroup()) { $currentFacet->setResponse($response['facets']); $result['faceted_data'][$facetName] = $facetModel->getItems($response['facets']); } else { if (isset($response['facets'][$facetName])) { $currentFacet->setResponse($response['facets'][$facetName]); $result['faceted_data'][$facetName] = $facetModel->getItems($response['facets'][$facetName]); } } $result['facets'][$facetName] = $currentFacet; } } } else { Mage::log($response['error'], Zend_Log::ERR, 'search_errors.log'); } return $result; }
/** * Get the ES query to be opimized. * * @return array */ private function _getBaseSearchQuery() { $store = Mage::app()->getStore($this->getStoreId()); $collection = Mage::helper('catalogsearch')->getEngine()->getResultCollection(); $allowedVisibilities = Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds(); $allowedStatuses = Mage::getSingleton('catalog/product_status')->getVisibleStatusIds(); $query = $collection->getSearchEngineQuery()->addFilter('terms', array('visibility' => $allowedVisibilities))->addFilter('terms', array('status' => $allowedStatuses)); if ($this->getStoreId() != Mage_Core_Model_App::ADMIN_STORE_ID) { $query->addFilter('terms', array('store_id' => $this->getStoreId())); } // Append the query string for the virtual categories if ($rule = $this->getCategory()->getVirtualRulePreview()) { $queryString = $this->_getQueryStringFromRule($rule); $query->addFilter('query', array('query_string' => $queryString)); } $query = $query->setLanguageCode(Mage::helper('smile_elasticsearch')->getLanguageCodeByStore($store)); $query->setQueryType("category_products_layer"); // Mimic query assembling, because ->search() is never really called on it $eventData = new Varien_Object(array('query' => $query->getRawQuery(), 'query_type' => $query->getQueryType(), 'store_id' => $this->getStoreId())); Mage::dispatchEvent('smile_elasticsearch_query_assembled', array('query_data' => $eventData)); $query = $eventData->getQuery(); return $query; }
/** * Get the ES query to be opimized. * * @return array */ private function _getBaseSearchQuery() { $store = Mage::app()->getStore($this->getStoreId()); $collection = Mage::helper('catalogsearch')->getEngine()->getResultCollection()->addSearchFilter($this->getFulltextQuery()); $allowedVisibilities = Mage::getSingleton('catalog/product_visibility')->getVisibleInSearchIds(); $allowedStatuses = Mage::getSingleton('catalog/product_status')->getVisibleStatusIds(); $query = $collection->getSearchEngineQuery()->addFilter('terms', array('store_id' => $this->getStoreId()))->addFilter('terms', array('visibility' => $allowedVisibilities))->addFilter('terms', array('status' => $allowedStatuses))->setLanguageCode(Mage::helper('smile_elasticsearch')->getLanguageCodeByStore($store)); $query->setQueryType("product_search_layer"); // Mimic query assembling, because ->search() is never really called on it $eventData = new Varien_Object(array('query' => $query->getRawQuery(), 'query_type' => $query->getQueryType(), 'store_id' => $this->getStoreId())); Mage::dispatchEvent('smile_elasticsearch_query_assembled', array('query_data' => $eventData)); $query = $eventData->getQuery(); return $query; }