Thursday, November 21, 2013

Varying Search Results post migration to SharePoint 2013

Hi,

In SharePoint 2013 central admin, through query builder we are passing one query and we are getting 4 results.
But we migrated a source code from SharePoint 2010 to SharePoint 2013 where we are getting only one result.
Earlier code in SharePoint 2010 is as below
 public static DataTable KeywordSearch(List<string> selectProperties,string scope,
            string searchServiceAppName,string query)
        {
            SearchQueryAndSiteSettingsServiceProxy settingsProxy = SPFarm.Local.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();
            SearchServiceApplicationProxy searchProxy =
                settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>(searchServiceAppName);

            KeywordQuery keywordQuery = new KeywordQuery(searchProxy);
            keywordQuery.QueryText = query;
            keywordQuery.ResultsProvider = Microsoft.Office.Server.Search.Query.SearchProvider.Default;
            foreach (string property in selectProperties)
            {
                keywordQuery.SelectProperties.Add(property);
            }
            keywordQuery.ResultTypes = ResultType.RelevantResults;
            keywordQuery.HiddenConstraints = "scope:" + "\"" + scope + "\"";                       

            ResultTableCollection resultsTableCollection = keywordQuery.Execute();           
            ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];
            DataTable resultsDataTable = new DataTable();
            resultsDataTable.TableName = "Results";
            resultsDataTable.Load(searchResultsTable, LoadOption.OverwriteChanges);
            var searchResultsTables = resultsTableCollection.Filter("TableType", KnownTableTypes.RelevantResults);
            DataTable resultsDataTable = new DataTable();
            if (searchResultsTables != null && searchResultsTables.Count() > 0)
                resultsDataTable = searchResultsTables.FirstOrDefault().Table;
            return resultsDataTable;
        }
Modified to SharePoint 2013 as below
   public static DataTable KeywordSearch(List<string> selectProperties,string scope,
            string searchServiceAppName,string query)
        {
            SearchQueryAndSiteSettingsServiceProxy settingsProxy = SPFarm.Local.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();
            SearchServiceApplicationProxy searchProxy =
                settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>(searchServiceAppName);

            KeywordQuery keywordQuery = new KeywordQuery(searchProxy);
            keywordQuery.QueryText = query;
            keywordQuery.ResultsProvider = Microsoft.Office.Server.Search.Query.SearchProvider.Default;
            foreach (string property in selectProperties)
            {
                keywordQuery.SelectProperties.Add(property);
            }         

            SearchObjectOwner owner = new SearchObjectOwner(SearchObjectLevel.Ssa);
            SourceRecord source = searchProxy.GetResultSourceByName(scope, owner);
            keywordQuery.SourceId = source.Id;

            SearchExecutor executor = new SearchExecutor();
            ResultTableCollection resultsTableCollection= executor.ExecuteQuery(keywordQuery);

            DataTable resultsDataTable = new DataTable();
            if (searchResultsTables != null && searchResultsTables.Count() > 0)
                resultsDataTable = searchResultsTables.FirstOrDefault().Table;
            return resultsDataTable;
        }
Finally our team has found solution by the including the below line
keywordQuery.SourceId = source.Id;
keywordQuery.TrimDuplicates = false;    
Now able to get the results exactly as per query builder in central admin

No comments:

Post a Comment