public async Task <SearchResults> SearchCodeAsync(SearchRequest searchRequest) { if (_searchClient == null) { _logger.LogInformation($"Code Search client isn't ready. Couldn't process request with filter '{searchRequest.Filter}'."); return(new SearchResults()); } SearchResults result = null; string searchTypeString; if (searchRequest.FindReferences) { searchTypeString = $"{searchRequest.Filter}"; // Do not use ref: prefix because it misses too many things } else { searchTypeString = $"def:{searchRequest.Filter}"; } var request = new CodeSearchRequest { SearchText = $"ext:cs {searchTypeString}{(searchRequest.ExactMatch ? string.Empty : "*")}", Skip = 0, Top = searchRequest.MaxResults, Filters = _searchFilters, IncludeFacets = false }; try { _logger.LogInformation($"Querying Azure DevOps Code Search with filter '{request.SearchText}'"); using (var ct = new CancellationTokenSource(searchRequest.Timeout)) { Stopwatch sw = Stopwatch.StartNew(); CodeSearchResponse response = await _searchClient.FetchCodeSearchResultsAsync(request, ct); _logger.LogInformation($"Response from Azure DevOps Code Search for filter '{request.SearchText}' completed in {sw.Elapsed.TotalSeconds:F2} seconds and contains results from {response.Results.Count()} files"); if (response != null) { result = await GetQuickFixesFromCodeResultsAsync(response.Results, searchRequest.FindReferences, searchRequest.Filter, searchRequest.ExactMatch); } } } catch (Exception e) { _logger.LogError(e, $"Failed to query Azure DevOps Code Search for filter '{request.SearchText}'"); } return(result ?? new SearchResults()); }
public static void Main(string[] args) { const string url = @"https://account.visualstudio.com"; Uri uri = new Uri(url); VssConnection connection = new VssConnection(uri, new VssClientCredentials()); SearchHttpClient searchClient = connection.GetClient <SearchHttpClient>(); IDictionary <string, IEnumerable <string> > filters = new Dictionary <string, IEnumerable <string> > { ["Project"] = new[] { "<repo project>" }, ["Repository"] = new[] { "<repo name>" }, ["Path"] = new[] { "" }, ["Branch"] = new[] { "master" }, // ["CodeElement"] = new[] { "def" } }; CodeSearchRequest searchRequest = new CodeSearchRequest { SearchText = "def:getconfig* OR basetype:getconfig*", Skip = 0, Top = 10, Filters = filters, IncludeFacets = true }; CodeSearchResponse searchResults = searchClient.FetchAdvancedCodeSearchResultsAsync(searchRequest).GetAwaiter().GetResult(); Console.WriteLine($"Total matches = {searchResults.Count}."); Console.WriteLine("Results fetched:"); int rank = 1; foreach (CodeResult result in searchResults.Results) { var f = Path.GetFileNameWithoutExtension(result.Filename); Console.WriteLine($"Rank = {rank++}, Project = {result.Project.Name}, Repository = {result.Repository.Name}, Branch = {result.Versions.FirstOrDefault()?.BranchName}, " + $"FilePath = {result.Path}, HitsInFile = {result.Matches.Count}"); } }