Click or drag to resize

ISearchSearchAsync Method

IT Hit WebDAV Classes Reference
Returns a list of items that correspond to a search request.

Namespace:  ITHit.WebDAV.Server.Search
Assembly:  ITHit.WebDAV.Server (in ITHit.WebDAV.Server.dll) Version: 13.3.13068
Syntax
Task<PageResults> SearchAsync(
	string searchString,
	SearchOptions options,
	List<PropertyName> propNames,
	Nullable<long> offset,
	Nullable<long> nResults
)

Parameters

searchString
Type: SystemString
A phrase to search.
options
Type: ITHit.WebDAV.Server.SearchSearchOptions
Search parameters.
propNames
Type: System.Collections.GenericListPropertyName
List of properties to retrieve with each item returned by this method. They will be requested by the Engine in GetPropertiesAsync(IListPropertyName, Boolean) call.
offset
Type: SystemNullableInt64
The number of items to skip before returning the remaining items.
nResults
Type: SystemNullableInt64
The number of items to return.

Return Value

Type: TaskPageResults
Instance of PageResults class that contains items on a requested page and total number of items in search results.
Remarks

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 indicate one or more characters the '%' is passed in search string.
  • To indicate exactly one character the '_' is passed in search string.

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 '_'.

Examples

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

}
Examples

The code below is part of 'WebDAVServer.FileSystemSynchronization.AspNetCore' C# & VB samples provided with the SDK.

C#
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);

}
See Also