private function buildResults()
 {
     $types = PhabricatorSearchApplicationSearchEngine::getIndexableDocumentTypes();
     $icons = mpull(PhabricatorPHIDType::getAllTypes(), 'getTypeIcon', 'getTypeConstant');
     $results = array();
     foreach ($types as $type => $name) {
         $results[$type] = id(new PhabricatorTypeaheadResult())->setPHID($type)->setName($name)->setIcon(idx($icons, $type));
     }
     return $results;
 }
 private function buildResults()
 {
     $viewer = $this->getViewer();
     $types = PhabricatorSearchApplicationSearchEngine::getIndexableDocumentTypes($viewer);
     $phid_types = mpull(PhabricatorPHIDType::getAllTypes(), null, 'getTypeConstant');
     $results = array();
     foreach ($types as $type => $name) {
         $type_object = idx($phid_types, $type);
         if (!$type_object) {
             continue;
         }
         $application_class = $type_object->getPHIDTypeApplicationClass();
         $application = PhabricatorApplication::getByClass($application_class);
         $application_name = $application->getName();
         $results[$type] = id(new PhabricatorTypeaheadResult())->setPHID($type)->setName($name)->addAttribute($application_name)->setIcon($type_object->getTypeIcon());
     }
     return $results;
 }
 private function getIndexConfiguration()
 {
     $data = array();
     $data['settings'] = array('index' => array('auto_expand_replicas' => '0-2', 'analysis' => array('filter' => array('trigrams_filter' => array('min_gram' => 3, 'type' => 'ngram', 'max_gram' => 3)), 'analyzer' => array('custom_trigrams' => array('type' => 'custom', 'filter' => array('lowercase', 'kstem', 'trigrams_filter'), 'tokenizer' => 'standard')))));
     $types = array_keys(PhabricatorSearchApplicationSearchEngine::getIndexableDocumentTypes());
     foreach ($types as $type) {
         // Use the custom trigram analyzer for the corpus of text
         $data['mappings'][$type]['properties']['field']['properties']['corpus'] = array('type' => 'string', 'analyzer' => 'custom_trigrams');
         // Ensure we have dateCreated since the default query requires it
         $data['mappings'][$type]['properties']['dateCreated']['type'] = 'string';
     }
     return $data;
 }
 public function executeSearch(PhabricatorSavedQuery $query)
 {
     $types = $query->getParameter('types');
     if (!$types) {
         $types = array_keys(PhabricatorSearchApplicationSearchEngine::getIndexableDocumentTypes());
     }
     // Don't use '/_search' for the case that there is something
     // else in the index (for example if 'phabricator' is only an alias to
     // some bigger index). Use '/$types/_search' instead.
     $uri = '/' . implode(',', $types) . '/_search';
     try {
         $response = $this->executeRequest($uri, $this->buildSpec($query));
     } catch (HTTPFutureHTTPResponseStatus $ex) {
         // elasticsearch probably uses Lucene query syntax:
         // http://lucene.apache.org/core/3_6_1/queryparsersyntax.html
         // Try literal search if operator search fails.
         if (!strlen($query->getParameter('query'))) {
             throw $ex;
         }
         $query = clone $query;
         $query->setParameter('query', addcslashes($query->getParameter('query'), '+-&|!(){}[]^"~*?:\\'));
         $response = $this->executeRequest($uri, $this->buildSpec($query));
     }
     $phids = ipull($response['hits']['hits'], '_id');
     return $phids;
 }