- Use KEYWORDQUERY class for full trust solutions; must execute directly on SharePoint farm; uses same KQL syntax.
- Set query with KeywordText property; use new SearchExecutor class to query Filter result tables with Filter(); Great for: managed code on SharePoint farm.
using (SPSite siteCollection = new SPSite("http://myserver/mysitecollection"))
{
KeywordQuery keywordQuery = new KeywordQuery(siteCollection);
keywordQuery.QueryText = "SharePoint";
SearchExecutor searchExecutor = new SearchExecutor();
ResultTableCollection resultTableCollection = searchExecutor.ExecuteQuery(keywordQuery);
var resultTables = resultTableCollection.Filter("TableType", KnownTableTypes.ReleventResults);
var resultTable = resultTables.FirstOrDefault();
DataTable dataTable = resultTable.Table;
}
Querying from the Client Managed CSOM
great for: provider hosted apps; remote .NET Application
Uses similar KeywordQuery and SearchExecutor classes; required a client context.
References:
Microsoft.SharePoint.Client.dll
Microsoft.SharePoint.Client.Runtime.dll
Microsoft.SharePoint.Client.Search.dll
using (ClientContext clientContext = new ClientContext("http://mysharepointsite"))
{
KeywordQuery keywordQuery = new KeywordQuery(clientContext);
keywordQuery.QueryText = "SharePoint";
SearchExecutor searchExecutor = new SearchExecutor(clientContext);
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
clientContext.ExecuteQuery();
foreach(var resultRow in results.Value[0].ResultRows)
{
Console.WriteLine("{0}: {1} ({2})", resultRow["Title"], resultRow["Path"], resultRow["Write"]);
}
Console.ReadLine();
}
Searching with JavaScript CSOM
Uses similar KeywordQuery and SearchExecutor objects; results easier to parse than REST; REST is still preferred method.
var keywordQuery = new Microsoft.ShaePoint.Client.Search.Query.KeywordQuery(context);
keywordQuery.set_queryText("SharePoint");
var searchExecutor = new Microsoft.SharePoint.Client.Search.Query.SearchExecutor(context);
results = searchExecutor.executeQuery(keywordQuery);
context.executeQueryAsync(onQuerySuccess, onQueryFail);
Querying from the client REST
/_api/search/query
use
querytext parameter to query; enclose query in single quotes
http://server/_api/search/query?querytext='SharePoint'
Issues: hard to retrieve extended fields; use the correct field name still couldn't get their values back.
REST + Javascript