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