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