Namespace: ITHit.WebDAV.Server.Search
Task<PageResults> SearchAsync( string searchString, SearchOptions options, List<PropertyName> propNames, Nullable<long> offset, Nullable<long> nResults )
This method is called by DavEngineAsync when client application is sending search request. In your implementation you must return a list of items that correspond to the requested search phrase and options.
The search phrase may contain wildcards:
To include '%', '_' and '\' characters in the search string thay are escaped with '\' character.
Note that IT Hit Ajax File Browser is using '*' and '?' as wildcard characters. In case included in search they are replaced with '%' and '_'.
The code below is part of 'WebDAVServer.FileSystemStorage.AspNet' C# & VB samples provided with the SDK.
public async Task<PageResults> SearchAsync(string searchString, SearchOptions options, List<PropertyName> propNames, long? offset, long? nResults) { bool includeSnippet = propNames.Any(s => s.Name == snippetProperty); // search both in file name and content string commandText = @"SELECT System.ItemPathDisplay" + (includeSnippet ? " ,System.Search.AutoSummary" : string.Empty) + " FROM SystemIndex " + @"WHERE scope ='file:@Path' AND (System.ItemNameDisplay LIKE '@Name' OR FREETEXT('""@Content""')) " + @"ORDER BY System.Search.Rank DESC"; commandText = PrepareCommand(commandText, "@Path", this.dirInfo.FullName, "@Name", searchString, "@Content", searchString); Dictionary<string, string> foundItems = new Dictionary<string, string>(); try { // Sending SQL request to Windows Search. To get search results file system indexing must be enabled. // To find how to enable indexing follow this link: http://windows.microsoft.com/en-us/windows/improve-windows-searches-using-index-faq using (OleDbConnection connection = new OleDbConnection(windowsSearchProvider)) using(OleDbCommand command = new OleDbCommand(commandText, connection)) { connection.Open(); using(OleDbDataReader reader = command.ExecuteReader()) { while (await reader.ReadAsync()) { string snippet = string.Empty; if (includeSnippet) { snippet = reader.GetValue(1) != DBNull.Value ? reader.GetString(1) : null; // XML does not support control characters or permanently undefined Unicode characters. Removing them from snippet. https://www.w3.org/TR/xml/#charsets if (!string.IsNullOrEmpty(snippet) && invalidXmlCharsPattern.IsMatch(snippet)) { snippet = invalidXmlCharsPattern.Replace(snippet, String.Empty); } } foundItems.Add(reader.GetString(0), snippet); } } } } catch (OleDbException ex) // explaining OleDbException { context.Logger.LogError(ex.Message, ex); switch (ex.ErrorCode) { case -2147217900: throw new DavException("Illegal symbols in search phrase.", DavStatus.CONFLICT); default: throw new DavException("Unknown error.", DavStatus.INTERNAL_ERROR); } } IList<IHierarchyItem> subtreeItems = new List<IHierarchyItem>(); foreach (string path in foundItems.Keys) { IHierarchyItem item = await context.GetHierarchyItemAsync(GetRelativePath(path)) as IHierarchyItem; if (item == null) { continue; } if (includeSnippet && item is DavFile) (item as DavFile).Snippet = HighlightKeywords(searchString.Trim('%'), foundItems[path]); subtreeItems.Add(item); } return new PageResults(offset.HasValue && nResults.HasValue ? subtreeItems.Skip((int)offset.Value).Take((int)nResults.Value) : subtreeItems, subtreeItems.Count); }
The code below is part of 'WebDAVServer.FileSystemSynchronization.AspNetCore' C# & VB samples provided with the SDK.
public async Task<PageResults> SearchAsync(string searchString, SearchOptions options, List<PropertyName> propNames, long? offset, long? nResults) { bool includeSnippet = propNames.Any(s => s.Name == snippetProperty); // search both in file name and content string commandText = @"SELECT System.ItemPathDisplay" + (includeSnippet ? " ,System.Search.AutoSummary" : string.Empty) + " FROM SystemIndex " + @"WHERE scope ='file:@Path' AND (System.ItemNameDisplay LIKE '@Name' OR FREETEXT('""@Content""')) " + @"ORDER BY System.Search.Rank DESC"; commandText = PrepareCommand(commandText, "@Path", this.dirInfo.FullName, "@Name", searchString, "@Content", searchString); Dictionary<string, string> foundItems = new Dictionary<string, string>(); try { // Sending SQL request to Windows Search. To get search results file system indexing must be enabled. // To find how to enable indexing follow this link: http://windows.microsoft.com/en-us/windows/improve-windows-searches-using-index-faq await using (OleDbConnection connection = new OleDbConnection(context.Config.WindowsSearchProvider)) await using(OleDbCommand command = new OleDbCommand(commandText, connection)) { connection.Open(); await using(OleDbDataReader reader = command.ExecuteReader()) { while (await reader.ReadAsync()) { string snippet = string.Empty; if (includeSnippet) { snippet = reader.GetValue(1) != DBNull.Value ? reader.GetString(1) : null; // XML does not support control characters or permanently undefined Unicode characters. Removing them from snippet. https://www.w3.org/TR/xml/#charsets if (!string.IsNullOrEmpty(snippet) && invalidXmlCharsPattern.IsMatch(snippet)) { snippet = invalidXmlCharsPattern.Replace(snippet, String.Empty); } } foundItems.Add(reader.GetString(0), snippet); } } } } catch (OleDbException ex) // explaining OleDbException { context.Logger.LogError(ex.Message, ex); switch (ex.ErrorCode) { case -2147217900: throw new DavException("Illegal symbols in search phrase.", DavStatus.CONFLICT); default: throw new DavException("Unknown error.", DavStatus.INTERNAL_ERROR); } } IList<IHierarchyItem> subtreeItems = new List<IHierarchyItem>(); foreach (string path in foundItems.Keys) { IHierarchyItem item = await context.GetHierarchyItemAsync(GetRelativePath(path)) as IHierarchyItem; if (item == null) { continue; } if (includeSnippet && item is DavFile) (item as DavFile).Snippet = HighlightKeywords(searchString.Trim('%'), foundItems[path]); subtreeItems.Add(item); } return new PageResults(offset.HasValue && nResults.HasValue ? subtreeItems.Skip((int)offset.Value).Take((int)nResults.Value) : subtreeItems, subtreeItems.Count); }