Пример #1
0
        /// <summary>
        /// Get all sites that match the passed query. Batching is done in batches of 500 as this is compliant for both Office 365 as SharePoint on-premises
        /// </summary>
        /// <param name="cc">ClientContext object of an arbitrary site collection accessible by the defined enumeration username and password</param>
        /// <param name="keywordQueryValue">Query string</param>
        /// <returns>List of found site collections</returns>
        private static List <String> SiteSearch(ClientRuntimeContext cc, string keywordQueryValue)
        {
            List <String> sites = new List <String>();

            KeywordQuery keywordQuery = new KeywordQuery(cc);

            // Important to avoid trimming "similar" site collections
            keywordQuery.TrimDuplicates = false;

            if (keywordQueryValue.Length == 0)
            {
                keywordQueryValue = "contentclass:\"STS_Site\"";
            }

            int startRow  = 0;
            int totalRows = 0;

            totalRows = ProcessQuery(cc, keywordQueryValue, sites, keywordQuery, startRow);

            if (totalRows > 0)
            {
                while (totalRows >= sites.Count)
                {
                    startRow += 500;
                    totalRows = ProcessQuery(cc, keywordQueryValue, sites, keywordQuery, startRow);
                }
            }

            return(sites);
        }
Пример #2
0
        /// <summary>
        /// Executes a keyword query against Office search service.
        /// </summary>
        /// <param name="keywordQuery">A keyword query instance.</param>
        /// <param name="refiners">A list of <see cref="SearchRefiner"/> objects where refinement results are populated.</param>
        /// <returns>Results returned from Office search service.</returns>
        public static ResultTable ExecuteQuery(KeywordQuery keywordQuery, SearchRefiner[] refiners)
        {
            CommonHelper.ConfirmNotNull(keywordQuery, "keywordQuery");
            LastQueryText = keywordQuery.QueryText;

            if (refiners != null)
            {
                keywordQuery.Refiners = String.Join(",", refiners.Select(v => v.PropertyName).ToArray());
                keywordQuery.RefinementFilters.AddRange(refiners.Where(v => v.RefinementToken != null).Select(v => v.RefinementToken).ToArray());
            }
            SearchExecutor        executor        = new SearchExecutor();
            ResultTableCollection queryResults    = executor.ExecuteQuery(keywordQuery);
            ResultTable           relevantResults = queryResults.Filter("TableType", KnownTableTypes.RelevantResults).FirstOrDefault();

            if (relevantResults == null)
            {
                throw new Exception("Search executor did not return result table of type RelevantResults");
            }
            if (refiners != null)
            {
                ResultTable refinementResults = queryResults.Filter("TableType", KnownTableTypes.RefinementResults).FirstOrDefault();
                if (refinementResults == null)
                {
                    throw new Exception("Search executor did not return result table of type RefinementResults");
                }
                foreach (SearchRefiner refiner in refiners)
                {
                    foreach (DataRow row in refinementResults.Table.Rows.OfType <DataRow>().Where(v => refiner.PropertyName.Equals(v["RefinerName"])))
                    {
                        refiner.AddRefinement((string)row["RefinementName"], (string)row["RefinementToken"], (int)row["RefinementCount"]);
                    }
                }
            }
            return(relevantResults);
        }
        private static string[] GetActorIds(ClientContext clientContext, string[] siteMembersEmails)
        {
            StringBuilder searchQueryText = new StringBuilder();

            foreach (string userEmail in siteMembersEmails) {
                if (searchQueryText.Length > 0) {
                    searchQueryText.Append(" OR ");
                }

                searchQueryText.AppendFormat("UserName:{0}", userEmail);
            }

            KeywordQuery searchQuery = new KeywordQuery(clientContext);
            searchQuery.QueryText = searchQueryText.ToString();
            searchQuery.SelectProperties.Add("DocId");
            searchQuery.SourceId = new Guid("b09a7990-05ea-4af9-81ef-edfab16c4e31");
            searchQuery.RowLimit = 100;

            SearchExecutor searchExecutor = new SearchExecutor(clientContext);
            ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(searchQuery);
            clientContext.ExecuteQuery();

            List<string> actorIds = new List<string>(results.Value[0].ResultRows.Count());

            foreach (var row in results.Value[0].ResultRows) {
                actorIds.Add(row["DocId"].ToString());
            }

            return actorIds.ToArray();
        }
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            SPSite       site = SPContext.Current.Site;
            KeywordQuery kq   = new KeywordQuery(site);

            kq.SourceId  = new Guid("8413cd39-2156-4e00-b54d-11efd9abdb89");
            kq.QueryText = "* " + searchText.Text;
            kq.SelectProperties.Add("Title");
            kq.SelectProperties.Add("Path");
            kq.RowLimit = 20;
            ResultTableCollection resultTables = new SearchExecutor().ExecuteQuery(kq);

            DataTable resultDataTable = resultTables.FirstOrDefault().Table;

            List <SearchResult> searchResultList = new List <SearchResult>();

            foreach (DataRow row in resultDataTable.Rows)
            {
                SearchResult searchResult = new SearchResult();

                searchResult.Title = row["Title"].ToString();
                searchResult.Url   = row["Path"].ToString();

                searchResultList.Add(searchResult);
            }

            rptSearch.DataSource = searchResultList;
            rptSearch.DataBind();
        }
Пример #5
0
        private void RunSearch(string searchText)
        {
            SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            Uri hostWeb = spContext.SPHostUrl;

            using (var context = spContext.CreateUserClientContextForSPHost()) {
                //Get current user
                User currentUser = context.Web.CurrentUser;
                context.Load(currentUser);
                context.ExecuteQuery();

                //Get current user's tasks
                KeywordQuery keywordQuery = new KeywordQuery(context);
                keywordQuery.QueryText = searchText;
                var searchExecutor = new SearchExecutor(context);
                ClientResult<ResultTableCollection> resultsCollection = searchExecutor.ExecuteQuery(keywordQuery);
                context.ExecuteQuery();

                //Bind them to the grid
                IEnumerable<IDictionary<string, object>> results = resultsCollection.Value[0].ResultRows;
                List<SearchResult> tasks = new List<SearchResult>();
                foreach (var result in results) {
                    SearchResult searchResult = new SearchResult();
                    searchResult.Title = result["Title"].ToString();
                    searchResult.Path = result["Path"].ToString();
                    tasks.Add(searchResult);
                }

                SearchResultsView.DataSource = tasks;
                SearchResultsView.DataBind();
            }
        }
Пример #6
0
        public List <Event> GetEvents()
        {
            List <Event> events;

            using (new SPMonitoredScope("Boxing Events Search Retrieval"))
            {
                KeywordQuery query = new KeywordQuery(SPContext.Current.Site);
                query.SelectProperties.AddRange(new[] { "Title", "EventDate", "Path" });
                query.QueryText = "ContentType:\"CT-Event\"";
                var searchExecutor            = new SearchExecutor();
                ResultTableCollection results = searchExecutor.ExecuteQuery(query);

                ResultTable resultTable = results.Filter("TableType", KnownTableTypes.RelevantResults).Single();

                events = (from DataRow row in resultTable.ResultRows
                          select new Event(
                              (string)row["Title"],
                              (DateTime)row["EventDate"],
                              (string)row["Path"])
                          ).OrderByDescending(ev => ev.EventDate)
                         .ThenBy(ev => ev.Title)
                         .ToList();
            }
            return(events);
        }
        public KeywordQueryInstance(ScriptEngine engine, KeywordQuery keywordQuery)
            : base(new QueryInstance(engine, keywordQuery), keywordQuery)
        {
            this.m_keywordQuery = keywordQuery;

            this.PopulateFunctions();
        }
Пример #8
0
        protected void cmdSearch_Click(object sender, EventArgs e)
        {
            string contextToken = SPAppToken.Value;
            string hostWeb      = Page.Request["SPHostUrl"];

            ClientContext ctx          = TokenHelper.GetClientContextWithContextToken(hostWeb, contextToken, Request.Url.Authority);
            KeywordQuery  keywordQuery = new KeywordQuery(ctx);

            keywordQuery.QueryText = txtSearchText.Text;

            SearchExecutor searchExecutor = new SearchExecutor(ctx);
            ClientResult <ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);

            ctx.ExecuteQuery();

            DataTable dt = new DataTable();

            dt.Columns.Add("Title");
            dt.Columns.Add("Author");
            dt.Columns.Add("Last Update");
            dt.Columns.Add("URL");

            if (results.Value.Count > 0)
            {
                foreach (Dictionary <String, Object> resultRow in results.Value[0].ResultRows)
                {
                    dt.Rows.Add(resultRow["Title"], resultRow["Author"], resultRow["Write"], resultRow["Path"]);
                }
            }

            grd.DataSource = dt;
            grd.DataBind();
        }
        private KeywordQuery GetQuery(string cQuery, string cProp, int StartRpw)
        {
            KeywordQuery kq = new KeywordQuery(ctx);

            try
            {
                kq.QueryText = cQuery;

                kq.StartRow    = 0;
                kq.RowLimit    = 500;
                kq.RowsPerPage = 500;
                kq.Timeout     = 60000;

                string[] mp = cProp.Split(',');
                foreach (string p in mp)
                {
                    kq.SelectProperties.Add(p);
                }
                kq.TrimDuplicates = false;
            } catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.Message);
            }
            return(kq);
        }
Пример #10
0
        private void RunSearch(string searchText)
        {
            SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            Uri hostWeb = spContext.SPHostUrl;

            using (var context = spContext.CreateUserClientContextForSPHost()) {
                //Get current user
                User currentUser = context.Web.CurrentUser;
                context.Load(currentUser);
                context.ExecuteQuery();

                //Get current user's tasks
                KeywordQuery keywordQuery = new KeywordQuery(context);
                keywordQuery.QueryText = searchText;
                var searchExecutor = new SearchExecutor(context);
                ClientResult <ResultTableCollection> resultsCollection = searchExecutor.ExecuteQuery(keywordQuery);
                context.ExecuteQuery();


                //Bind them to the grid
                IEnumerable <IDictionary <string, object> > results = resultsCollection.Value[0].ResultRows;
                List <SearchResult> tasks = new List <SearchResult>();
                foreach (var result in results)
                {
                    SearchResult searchResult = new SearchResult();
                    searchResult.Title = result["Title"].ToString();
                    searchResult.Path  = result["Path"].ToString();
                    tasks.Add(searchResult);
                }

                SearchResultsView.DataSource = tasks;
                SearchResultsView.DataBind();
            }
        }
      private void SelectSharePointSite_Load( object sender, EventArgs e )
      {
         if ( _ctx == null )
         {
            throw new ArgumentException( "You must set the SharePoint RootSite Url before opening this form." );
         }
         KeywordQuery kwq = new KeywordQuery( _ctx )
         {
            QueryText = "contentclass =\"STS_Web\" OR contentclass=\"STS_Site\""
         };
         SearchExecutor seExecute = new SearchExecutor( _ctx );
         var results = seExecute.ExecuteQuery( kwq );
         _ctx.ExecuteQuery();
         lstSharePointSites.DisplayMember = "SiteName";
         lstSharePointSites.ValueMember = "Path";
         lstSharePointSites.DataSource = ( from r in results.Value[ 0 ].ResultRows
                                           where
                                                 !r[ "Author" ].ToString().Equals( "System Account" )
                                                 && !string.IsNullOrEmpty( r[ "Author" ].ToString() )
                                                 && !r[ "Path" ].ToString().Contains( "-my" )
                                           select new
                                           {
                                              SiteName = r[ "Title" ] + " -|- " + r[ "Author" ],
                                              Path = r[ "Path" ]
                                           } ).ToArray();
         this.Closed += ( s, args ) =>
         {
            _ctx.Dispose();
         };

      }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            try {
                KeywordQuery query = new KeywordQuery(this.Site.Read());
                query.QueryText = this.Query;
                query.SelectProperties.AddRange(this.Select);

                SearchExecutor        executor    = new SearchExecutor();
                ResultTableCollection result      = executor.ExecuteQuery(query);
                ResultTable           resultTable = result.Filter("TableType", KnownTableTypes.RelevantResults).FirstOrDefault();
                if (resultTable == null)
                {
                    throw new Exception("Search executor did not return result table of type RelevantResults");
                }
                DataTable dataTable = new DataTable();
                dataTable.Load(resultTable);

                foreach (DataRow row in dataTable.Rows)
                {
                    PSObject obj = new PSObject();
                    foreach (DataColumn column in dataTable.Columns)
                    {
                        obj.Members.Add(new PSNoteProperty(column.Caption, row[column]));
                    }
                    WriteObject(obj);
                }
            } catch (Exception ex) {
                ThrowTerminatingError(ex, ErrorCategory.NotSpecified);
            }
        }
Пример #13
0
        private KeywordQuery GetQuery(string sortExpression)
        {
            var query = new KeywordQuery(SPContext.Current.Site);

            query.QueryText   = this.dataSource.QueryText;
            query.ResultTypes = ResultType.RelevantResults;

            if (!string.IsNullOrEmpty(this.dataSource.SelectProperties))
            {
                query.SelectProperties.Clear();
                foreach (var property in this.dataSource.SelectProperties.Split(','))
                {
                    query.SelectProperties.Add(property.Trim());
                }
            }

            if (!string.IsNullOrEmpty(sortExpression))
            {
                query.SortList.Clear();
                foreach (var sort in sortExpression.Split(','))
                {
                    if (sort.EndsWith(" DESC"))
                    {
                        query.SortList.Add(sort.Substring(0, sort.IndexOf(" DESC")), SortDirection.Descending);
                    }
                    else
                    {
                        query.SortList.Add(sort, SortDirection.Ascending);
                    }
                }
            }

            return(query);
        }
Пример #14
0
        /// <summary>
        /// Query SharePoint Search and fetch information about each file (URL and name).
        /// </summary>
        /// <param name="client">Existing SharePoint ClientContext</param>
        /// <param name="folderUrl">Full server folder URL</param>
        /// <returns>List of files information</returns>
        static async Task <IEnumerable <SPFileInfo> > GetFilesFromFolderAsync(ClientContext client, string folderUrl)
        {
            KeywordQuery query = new KeywordQuery(client)
            {
                QueryText = $"IsContainer=false Path:\"{folderUrl}\"",
                RowLimit  = 500
            };
            SearchExecutor searchExecutor = new SearchExecutor(client);
            ClientResult <ResultTableCollection> results = searchExecutor.ExecuteQuery(query);
            await client.ExecuteQueryAsync();

            var relevantResults = results.Value.Where(x => x.TableType == "RelevantResults").FirstOrDefault();

            if (relevantResults == null)
            {
                return(Array.Empty <SPFileInfo>());
            }

            var files = new List <SPFileInfo>();

            foreach (IDictionary <string, object> item in relevantResults.ResultRows)
            {
                var fileKey  = item.Where(x => x.Key == "Path").FirstOrDefault();
                Uri filePath = new Uri(fileKey.Value.ToString());

                files.Add(new SPFileInfo()
                {
                    ServerRelativeUrl = filePath.PathAndQuery,
                    FileName          = filePath.PathAndQuery.Substring(filePath.PathAndQuery.LastIndexOf("/") + 1)
                });
            }

            return(files);
        }
Пример #15
0
        public static List <SiteEntity> SiteSearch(this Web web, string keywordQueryValue, bool trimDuplicates = false)
        {
            try
            {
                //Log.Debug(Constants.LOGGING_SOURCE, "Site search '{0}'", keywordQueryValue);

                List <SiteEntity> sites = new List <SiteEntity>();

                KeywordQuery keywordQuery = new KeywordQuery(web.Context);
                keywordQuery.TrimDuplicates = trimDuplicates;

                //int startRow = 0;
                int totalRows = 0;

                totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery);


                if (totalRows > 0)
                {
                    while (totalRows > 0)
                    {
                        totalRows = web.ProcessQuery(keywordQueryValue + " AND IndexDocId >" + sites.Last().IndexDocId, sites, keywordQuery);// From the second Query get the next set (rowlimit) of search result based on IndexDocId
                    }
                }

                return(sites);
            }
            catch (Exception ex)
            {
                //Log.Error(Constants.LOGGING_SOURCE, CoreResources.WebExtensions_SiteSearchUnhandledException, ex.Message);
                // rethrow does lose one line of stack trace, but we want to log the error at the component boundary
                throw;
            }
        }
Пример #16
0
        /// <summary>
        /// Returns the site collections that comply with the passed keyword query
        /// </summary>
        /// <param name="web">Site to be processed - can be root web or sub site</param>
        /// <param name="keywordQueryValue">Keyword query</param>
        /// <returns>All found site collections</returns>
        public static List <SiteEntity> SiteSearch(this Web web, string keywordQueryValue)
        {
            List <SiteEntity> sites = new List <SiteEntity>();

            KeywordQuery keywordQuery = new KeywordQuery(web.Context);

            keywordQuery.TrimDuplicates = false;

            if (keywordQueryValue.Length == 0)
            {
                keywordQueryValue = "contentclass:\"STS_Site\"";
            }

            int startRow  = 0;
            int totalRows = 0;

            totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);

            if (totalRows > 0)
            {
                while (totalRows >= sites.Count)
                {
                    startRow += 500;
                    totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);
                }
            }

            return(sites);
        }
Пример #17
0
        private List <string> GetUserLoginNamesFromSearch()
        {
            Logger?.Debug($"[O365] Getting user list from search");

            try
            {
                List <string> loginNames = new List <string>();

                var            ctx            = GetSpoClientContextForSite(SpoSite.RootSite);
                SearchExecutor searchExecutor = new SearchExecutor(ctx);

                int currentPage = 0;
                int totalRows   = -1;
                int startRow    = 1;
                int rowLimit    = 10;
                do
                {
                    startRow = (rowLimit * currentPage) + 1;

                    // http://www.techmikael.com/2015/01/how-to-query-using-result-source-name.html
                    KeywordQuery qry = new KeywordQuery(ctx);
                    qry.Properties["SourceName"]  = "Local People Results";
                    qry.Properties["SourceLevel"] = "SSA";

                    qry.QueryText = "*";
                    qry.RowLimit  = rowLimit;
                    qry.StartRow  = startRow;

                    ClientResult <ResultTableCollection> results = searchExecutor.ExecuteQuery(qry);
                    ctx.ExecuteQueryWithIncrementalRetry(SpoRetries, SpoBackoff, Logger);

                    var resultTable = results.Value[0];

                    if (currentPage == 0)
                    {
                        totalRows = resultTable.TotalRows;
                    }

                    foreach (var resultRow in resultTable.ResultRows)
                    {
                        loginNames.Add(resultRow["AccountName"].ToString());
                    }

                    currentPage++;
                } while (startRow + rowLimit < totalRows);

                return(loginNames);
            }
            catch (MaximumRetryAttemptedException ex)
            {
                // Exception handling for the Maximum Retry Attempted
                Logger?.Error($"[O365] Max retries / throttle for SPO reached getting site user list. Message {ex.Message}");
                throw new O365Exception($"Max retries / throttle for SPO reached. Message {ex.Message}", ex);
            }
            catch (Exception ex)
            {
                Logger?.Error($"[O365] Problem getting root site user list. Message {ex.Message}");
                throw new O365Exception($"Problem getting root site user list. Message {ex.Message}", ex);
            }
        }
Пример #18
0
        private void RunSearch(string searchText)
        {
            SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
              Uri hostWeb = spContext.SPHostUrl;

              using (var context = TokenHelper.GetS2SClientContextWithWindowsIdentity(hostWeb, Request.LogonUserIdentity)) {
            //Get current user
            User currentUser = context.Web.CurrentUser;
            context.Load(currentUser);
            context.ExecuteQuery();

            //Get current user's tasks
            KeywordQuery keywordQuery = new KeywordQuery(context);
            keywordQuery.QueryText = searchText;
            var searchExecutor = new SearchExecutor(context);
            ClientResult<ResultTableCollection> resultsCollection = searchExecutor.ExecuteQuery(keywordQuery);
            context.ExecuteQuery();

            //Bind them to the grid
            IEnumerable<IDictionary<string, object>> results = resultsCollection.Value[0].ResultRows;
            List<Task> tasks = new List<Task>();
            foreach (var result in results) {
              Task task = new Task();
              task.Title = result["Title"].ToString();
              task.Path = result["Path"].ToString();
              tasks.Add(task);
            }

            SearchResultsView.DataSource = tasks;
            SearchResultsView.DataBind();
              }
        }
Пример #19
0
        private void RunSearch(string searchText)
        {
            SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            Uri hostWeb = spContext.SPHostUrl;

            using (var context = TokenHelper.GetS2SClientContextWithWindowsIdentity(hostWeb, Request.LogonUserIdentity)) {
                //Get current user
                User currentUser = context.Web.CurrentUser;
                context.Load(currentUser);
                context.ExecuteQuery();

                //Get current user's tasks
                KeywordQuery keywordQuery = new KeywordQuery(context);
                keywordQuery.QueryText = searchText;
                var searchExecutor = new SearchExecutor(context);
                ClientResult <ResultTableCollection> resultsCollection = searchExecutor.ExecuteQuery(keywordQuery);
                context.ExecuteQuery();


                //Bind them to the grid
                IEnumerable <IDictionary <string, object> > results = resultsCollection.Value[0].ResultRows;
                List <Task> tasks = new List <Task>();
                foreach (var result in results)
                {
                    Task task = new Task();
                    task.Title = result["Title"].ToString();
                    task.Path  = result["Path"].ToString();
                    tasks.Add(task);
                }

                SearchResultsView.DataSource = tasks;
                SearchResultsView.DataBind();
            }
        }
        public static void GetUnlabeledDocsFromSearch(ICollector <UnlabeledDocument> queueData, TraceWriter log)
        {
            Stopwatch sw = new Stopwatch();

            //var ac = new AuthenticationContext(Constants.AuthorityUri, false);
            var cert = Utils.GetCertificate(Constants.AADAppCertificateThumbprint);

            ClientAssertionCertificate cac = new ClientAssertionCertificate(Constants.AADAppClientId, cert);

            var authResult = ac.AcquireTokenAsync(Constants.ResourceUri, cac).Result;

            using (ClientContext cc = new ClientContext(Constants.TenantRootUrl))
            {
                cc.ExecutingWebRequest += (s, e) =>
                {
                    e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + authResult.AccessToken;
                };

                ClientResult <ResultTableCollection> results = new ClientResult <ResultTableCollection>();
                KeywordQuery keywordQuery = new KeywordQuery(cc);

                int startRow = 0;
                var defaultRetentionLabel = Environment.GetEnvironmentVariable("defaultRetentionLabel");

                sw.Start();
                do
                {
                    keywordQuery.StartRow       = startRow;
                    keywordQuery.QueryText      = Constants.KeywordQueryForComplianceTag;
                    keywordQuery.RowLimit       = 500;
                    keywordQuery.TrimDuplicates = false;

                    SearchExecutor searchExec = new SearchExecutor(cc);
                    results = searchExec.ExecuteQuery(keywordQuery);
                    cc.ExecuteQuery();

                    if (results != null)
                    {
                        if (results.Value[0].RowCount > 0)
                        {
                            foreach (var row in results.Value[0].ResultRows)
                            {
                                var path              = row["Path"].ToString();
                                var byteEncodedPath   = HttpUtility.UrlEncode(row["Path"].ToString());
                                var byteEncodedWebUrl = HttpUtility.UrlEncode(row["SPWebUrl"].ToString());

                                log.Info("Unlabeled document at: " + path);

                                queueData.Add(new UnlabeledDocument(byteEncodedWebUrl, byteEncodedPath, Constants.DefaultRetentionLabel));
                            }
                        }
                    }

                    startRow += results.Value[0].RowCount;
                } while (results.Value[0].TotalRowsIncludingDuplicates > startRow);
                sw.Stop();
                telemetry.TrackMetric("CSOM-GetUnlabeledDocs", sw.ElapsedMilliseconds);
            }
        }
Пример #21
0
        private IEnumerable <NavigationNode> GetNavigationNodesBySearch(SPWeb web, NavigationSearchSettings settings, IEnumerable <string> additionalFilters = null)
        {
            var filters = new List <string>(settings.GlobalFilters);

            // Check if find result source
            var searchResultSource = this.searchHelper.GetResultSourceByName(web.Site, settings.ResultSourceName, SearchObjectLevel.Ssa);

            if (searchResultSource == null)
            {
                this.logger.Error("searchResultSource is null in GSoft.Dynamite.Navigation.NavigationService.GetNavigationNodeItems");
                return(new List <NavigationNode>());
            }

            var query = new KeywordQuery(web)
            {
                SourceId       = searchResultSource.Id,
                TrimDuplicates = false,
                RowLimit       = 500
            };

            // Add defined filters
            if (additionalFilters != null)
            {
                filters.AddRange(additionalFilters);
            }

            if (settings.SelectedProperties != null && settings.SelectedProperties.Any())
            {
                query.SelectProperties.AddRange(settings.SelectedProperties.ToArray());
            }

            // TODO: For now, the filters are applied seperated by whitespaces which means "AND" in KQL land.
            // TODO: We should figure out a way to make this more flexible to use "OR" if necessary.
            query.QueryText = string.Join(" ", filters.Where(filter => !string.IsNullOrEmpty(filter)));

            // Execute search query
            var tables = new SearchExecutor().ExecuteQuery(query);

            if (tables.Exists(KnownTableTypes.RelevantResults))
            {
                // Build navigation nodes for search results
                var results = tables.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
                var nodes   = results.Table.Rows.Cast <DataRow>().Select(dataRow => new NavigationNode(dataRow, settings.NavigationManagedPropertyName));
                this.logger.Info(
                    "GetNavigationNodeItems: Found {0} items with search query '{1}' from source '{2}'.",
                    results.Table.Rows.Count,
                    query.QueryText,
                    settings.ResultSourceName);

                return(nodes);
            }

            this.logger.Error(
                "GetNavigationNodeItems: No relevant results table found with search query '{0}' from source '{1}'.",
                query.QueryText,
                settings.ResultSourceName);

            return(new List <NavigationNode>());
        }
Пример #22
0
 private static void PopulateQueryDefaults(KeywordQuery query)
 {
     query.ProcessBestBets              = false;
     query.BypassResultTypes            = true;
     query.Properties["EnableStacking"] = false;
     query.EnableStemming   = false;
     query.EnableQueryRules = false;
 }
Пример #23
0
 public KeywordQueryCamlVisitor(KeywordQuery query, Hashtable bindings)
 {
     CommonHelper.ConfirmNotNull(query, "query");
     CommonHelper.ConfirmNotNull(bindings, "bindings");
     this.query    = query;
     this.bindings = bindings;
     this.managedPropertyDictionary = SearchServiceHelper.GetManagedPropertyNames(query.Site);
 }
        private DataTable GetItems()
        {
            DataTable resultsDataTable = new DataTable();

            if (tags.Length > 0)
            {
                SPSite site = new SPSite(SPContext.Current.Site.Url);

                /*
                 * FullTextSqlQuery query = new FullTextSqlQuery(site);
                 * query.Hint = QueryHint.OptimizeWithPropertyStore;
                 * // inserito per prendere tutto. BUG della search
                 * query.TrimDuplicates = false;
                 * query.QueryText = "SELECT Path, title, Created, Tags, TipoContenuto, SiteTitle, SiteName FROM scope() WHERE \"scope\"='All Sites' AND (CONTAINS(Tags,'\"" + tags[0] + "\"')";
                 * if (tags.Length > 1)
                 * {
                 *  for (int i = 1; i < tags.Length; i++)
                 *  {
                 *      query.QueryText += " OR CONTAINS(Tags,'\"" + tags[i] + "\"')";
                 *  }
                 * }
                 * query.QueryText += ") ORDER BY LastModifiedTime Desc";
                 * query.SiteContext = new Uri(site.Url);
                 * query.ResultTypes = ResultType.RelevantResults;
                 * */
                SearchServiceApplicationProxy proxy =
                    (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(SPContext.Current.Site));
                KeywordQuery query = new KeywordQuery(proxy);
                //query.EnableFQL = true;
                query.QueryText = propertyName + ":\"" + tags[0] + "\"";
                if (tags.Length > 1)
                {
                    for (int i = 1; i < tags.Length; i++)
                    {
                        query.QueryText += " OR " + propertyName + ":\"" + tags[i] + "\"";
                    }
                }
                query.ResultsProvider = SearchProvider.Default;
                query.ResultTypes     = ResultType.RelevantResults;
                query.StartRow        = 0;
                query.RowLimit        = 5000;
                query.TrimDuplicates  = false;
                query.SelectProperties.Add("Path");
                query.SelectProperties.Add("title");
                query.SelectProperties.Add("Descrizione");
                query.SelectProperties.Add(propertyName);
                query.SelectProperties.Add("TipoContenuto");
                query.SelectProperties.Add("Created");
                query.SelectProperties.Add("SiteTitle");
                query.SelectProperties.Add("SiteName");
                query.SortList.Add("Rank", Microsoft.Office.Server.Search.Query.SortDirection.Descending);
                //
                ResultTableCollection resultTables    = query.Execute();
                ResultTable           relevantResults = resultTables[ResultType.RelevantResults];
                resultsDataTable.Load(relevantResults, LoadOption.OverwriteChanges);
            }
            return(resultsDataTable);
        }
Пример #25
0
        public ResultTableCollection ExecuteSearch(ClientContext context, string location, bool searchOnlySiteCollection)
        {
            SearchExecutor searchExecutor = new SearchExecutor(context);
            KeywordQuery   keywordQuery   = searchOnlySiteCollection ? SharepointCsomProvider.GetKeywordQueryForSiteCollectionOnly(location, context) : SharepointCsomProvider.GetKeywordQuery(location, context);
            ClientResult <ResultTableCollection> clientResult = searchExecutor.ExecuteQuery(keywordQuery);

            context.ExecuteQuery();
            return(clientResult.Value);
        }
Пример #26
0
        public List <Dictionary <string, string> > Search(Web web, string keywordQueryValue, List <string> propertiesToRetrieve, bool trimDuplicates = false)
        {
            try
            {
                List <Dictionary <string, string> > sites = new List <Dictionary <string, string> >();

                KeywordQuery keywordQuery = new KeywordQuery(web.Context);
                keywordQuery.TrimDuplicates = trimDuplicates;
                keywordQuery.SourceId       = localSharePointResultsSourceId;

                //property IndexDocId is required, so add it if not yet present
                if (!propertiesToRetrieve.Contains("IndexDocId"))
                {
                    propertiesToRetrieve.Add("IndexDocId");
                }

                int totalRows = 0;

                Log($"Start search query {keywordQueryValue}");
                totalRows = this.ProcessQuery(web, keywordQueryValue, propertiesToRetrieve, sites, keywordQuery);
                Log($"Found {totalRows} rows...");
                if (totalRows > 0)
                {
                    string previousLastIndexDocId = null;

                    while (totalRows > 0)
                    {
                        string lastIndexDocIdString = "";
                        double lastIndexDocId       = 0;

                        if (sites.Last().TryGetValue("IndexDocId", out lastIndexDocIdString))
                        {
                            // Leave the loop if for some reason we're getting the same lastIndexDocId --> should not happen, this is an
                            // extra safety to prevent from getting stuck in an infinite loop.
                            if (previousLastIndexDocId != null && previousLastIndexDocId.Equals(lastIndexDocIdString))
                            {
                                Log($"Breaking loop, lastIndexDocId was {previousLastIndexDocId}");
                                break;
                            }

                            lastIndexDocId = double.Parse(lastIndexDocIdString);
                            Log($"Retrieving a batch of up to 500 search results");
                            keywordQuery.SourceId  = localSharePointResultsSourceId;
                            totalRows              = this.ProcessQuery(web, keywordQueryValue + " AND IndexDocId >" + lastIndexDocId, propertiesToRetrieve, sites, keywordQuery);// From the second Query get the next set (rowlimit) of search result based on IndexDocId
                            previousLastIndexDocId = lastIndexDocIdString;
                        }
                    }
                }

                return(sites);
            }
            catch (Exception)
            {
                // rethrow does lose one line of stack trace, but we want to log the error at the component boundary
                throw;
            }
        }
Пример #27
0
        public ResultTableCollection ExecuteSearch(ClientContext context, Guid webId, Guid siteId)
        {
            SearchExecutor searchExecutor = new SearchExecutor(context);
            KeywordQuery   keywordQuery   = SharepointCsomProvider.GetKeywordQuery(webId, siteId, context);
            ClientResult <ResultTableCollection> clientResult = searchExecutor.ExecuteQuery(keywordQuery);

            context.ExecuteQuery();
            return(clientResult.Value);
        }
Пример #28
0
 private static void FillSelectProperties(string select, KeywordQuery query)
 {
     if (!string.IsNullOrEmpty(select))
     {
         var properties = select.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries);
         query.SelectProperties.Clear();
         query.SelectProperties.AddRange(properties);
     }
 }
        /// <summary>
        /// Get the peer url for a page represents a cross site publishing catalog item
        /// </summary>
        /// <param name="currentUrl">The current page url</param>
        /// <param name="label">The target label to resolve</param>
        /// <param name="associationKeyManagedPropertyName">The content association key search managed property name</param>
        /// <param name="associationKeyValue">The value of the content association key for the current item</param>
        /// <param name="languageManagedPropertyName">The language search managed property name</param>
        /// <param name="catalogNavigationTermManagedPropertyName">The navigation search managed property name used for the friendly url generation</param>
        /// <returns>The url of the peer page</returns>
        public Uri GetPeerCatalogItemUrl(
            Uri currentUrl,
            VariationLabelInfo label,
            string associationKeyManagedPropertyName,
            string associationKeyValue,
            string languageManagedPropertyName,
            string catalogNavigationTermManagedPropertyName)
        {
            ValidateProperties("GetPeerCatalogItemUrl", associationKeyManagedPropertyName, associationKeyValue, catalogNavigationTermManagedPropertyName);

            var url = new Uri(Variations.GetPeerUrl(SPContext.Current.Web, currentUrl.AbsoluteUri, label.Title), UriKind.Relative);

            var searchResultSource = this.searchHelper.GetResultSourceByName(SPContext.Current.Site, LocalSharePointResultsSourceName, SearchObjectLevel.Ssa);

            // We take the Title of the Label because the Label.Language is always a language from a language pack (supported). Sometimes, we deal with Not implemented language (ie Inuktitut "IU").
            // Our workaround is to set the Title as the agnostic language label ("en", "fr", "iu", etc).
            // For backward compatibility purpose, we will test the length of the Title. If it's not 2, we will fallback on the Language of the Label.
            // This is not 100% robust but it the only way we found to deal with unsupported language.
            var labelLocaleAgnosticLanguage = label.Title.Length == 2 ? label.Title : label.Language.Split('-').FirstOrDefault();

            var queryText = string.Format(
                CultureInfo.InvariantCulture,
                "{0}:{1} {2}={3}",
                associationKeyManagedPropertyName,
                associationKeyValue,
                languageManagedPropertyName,
                labelLocaleAgnosticLanguage);

            var query = new KeywordQuery(SPContext.Current.Web)
            {
                SourceId  = searchResultSource.Id,
                QueryText = queryText
            };

            // Search query must include the following properties for the friendly URL to work
            query.SelectProperties.AddRange(new[]
            {
                catalogNavigationTermManagedPropertyName,
                BuiltInManagedProperties.Url,
                BuiltInManagedProperties.SiteUrl,
                BuiltInManagedProperties.ListId
            });
            var tables = new SearchExecutor().ExecuteQuery(query);

            if (tables.Exists(KnownTableTypes.RelevantResults))
            {
                var table = tables.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
                if (table != null && table.ResultRows.Count == 1 && table.Table.Columns.Contains(BuiltInManagedProperties.Url))
                {
                    url = new Uri(table.Table.Rows[0][BuiltInManagedProperties.Url].ToString());
                }
            }

            return(url);
        }
Пример #30
0
        private List <SiteData> GetSites(ClientContext clientContext)
        {
            List <SiteData> sites = new List <SiteData>();

            KeywordQuery keywordQuery      = new KeywordQuery(clientContext);
            string       keywordQueryValue = "contentclass:\"STS_Site\"";

            ProcessQuery(keywordQueryValue, sites, clientContext, keywordQuery, 0);

            return(sites);
        }
Пример #31
0
        /* It includes methods related to SampleEntity */
        #endregion

        #region Methods
        public static List <SearchModel> QuerySearchResults(string siteUrl, string queryText, string contentTypeId, int contentTypeCode, string contentTypeName, string redirectUrl)
        {
            try
            {
                List <SearchModel> searchResults = new List <SearchModel>();

                System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(Data.DataStatics.UserNameForService, Data.DataStatics.PasswordForService, Data.DataStatics.DomainForService);


                ClientContext clientContext = new ClientContext(siteUrl);
                clientContext.Credentials = credentials;

                KeywordQuery keywordQuery = new KeywordQuery(clientContext);
                keywordQuery.QueryText = queryText;
                keywordQuery.SortList.Add("Created", SortDirection.Descending);
                string filter1 = "contenttypeid:equals(\"{0}\")";
                keywordQuery.RefinementFilters.Add(string.Format(filter1, contentTypeId));
                keywordQuery.SelectProperties.Add("ContentTypeId");
                keywordQuery.SelectProperties.Add("Title");
                keywordQuery.SelectProperties.Add("ListItemID");
                keywordQuery.RowLimit   = 10;
                keywordQuery.ClientType = "ContentSearchRegular";

                SearchExecutor searchExecutor = new SearchExecutor(clientContext);
                ClientResult <ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
                clientContext.ExecuteQuery();

                IEnumerable <IDictionary <string, object> > resultTable = results.Value[0].ResultRows;

                if (resultTable != null)
                {
                    foreach (var resultRow in resultTable)
                    {
                        SearchModel newSearchItem = new SearchModel();
                        newSearchItem.Title           = resultRow["Title"].ToString();
                        newSearchItem.ListItemId      = resultRow["ListItemID"].ToString();
                        newSearchItem.ContentTypeId   = resultRow["ContentTypeId"].ToString();
                        newSearchItem.ContentTypeName = contentTypeName;
                        newSearchItem.ContentTypeCode = contentTypeCode;
                        newSearchItem.RedirectUrl     = redirectUrl;
                        searchResults.Add(newSearchItem);
                    }
                }

                clientContext.Dispose();

                return(searchResults);
            }
            catch (Exception ex)
            {
                EXP.RedirectToErrorPage(ex.Message);
                return(null);
            }
        }
Пример #32
0
        void oWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            int StartRow = 0;

            try
            {
                string         mp           = "Title,Path,SPSiteURL,ListItemID,ListID,UniqueID,Language";
                KeywordQuery   kq           = GetQuery("ContentType:gbBook", mp, 0);
                ResultTable    firstResults = GetResults(kq);
                List <dynamic> items        = new List <dynamic>();
                items = UpdateItems(items, firstResults, mp);



                //if (firstResults.RowCount != firstResults.TotalRows)
                //{
                //    while ((StartRow + 500) < firstResults.TotalRows)
                //    {
                //        StartRow += 500;
                //        ShowProgress("Starting At: " + StartRow);
                //        KeywordQuery nestedkq = GetQuery("ContentType:gbBook", "Title;Path", StartRow);
                //        ResultTable nestedResults = GetResults(kq);
                //        items = UpdateItems(items, nestedResults,mp);
                //    }

                //}


                System.Diagnostics.Trace.WriteLine(firstResults.TotalRows);
                List lst = ctx.Web.Lists.GetByTitle("BookInfo");
                ctx.Load(lst);
                ctx.ExecuteQuery();
                foreach (IDictionary <string, object> item in firstResults.ResultRows)
                {
                    string id = item["UniqueID"].ToString();

                    ListItem itm = lst.GetItemByField(id, "ItemUniqueId");
                    if (itm == null)
                    {
                        ListItemCreationInformation lici = new ListItemCreationInformation();
                        ListItem newItem = lst.AddItem(lici);
                        newItem["ItemUniqueId"] = id;
                    }
                    itm["Title"]    = item["Title"].ToString();
                    itm["Language"] = item["Language"].ToString();
                    itm.Update();
                    ctx.ExecuteQuery();
                }
            }
            catch (Exception ex)
            {
                ShowError(ex, "metadataWorker.oWorker_DoWork", "");
            }
        }
Пример #33
0
 /// <summary>
 /// Returns the Keyword query object with refiners added for sorting
 /// </summary>
 /// <param name="keywordQuery">Keyword object</param>
 /// <param name="sortByProperty">Property by which sort is applied</param>
 /// <param name="sortDirection">Direction in which sort is applied (0 --> Ascending order and 1 --> Descending order)</param>
 /// <returns>Keyword object with sorting refiners applied</returns>
 internal static KeywordQuery AddSortingRefiner(KeywordQuery keywordQuery, string sortByProperty, int sortDirection)
 {
     if (0 == sortDirection)
     {
         keywordQuery.SortList.Add(sortByProperty, Microsoft.SharePoint.Client.Search.Query.SortDirection.Ascending);
     }
     else if (1 == sortDirection)
     {
         keywordQuery.SortList.Add(sortByProperty, Microsoft.SharePoint.Client.Search.Query.SortDirection.Descending);
     }
     return keywordQuery;
 }
Пример #34
0
        /// <summary>
        /// Get the peer url for a page represents a cross site publishing catalog item
        /// </summary>
        /// <param name="currentUrl">The current page url</param>
        /// <param name="label">The target label to resolve</param>
        /// <param name="associationKeyManagedPropertyName">The content association key search managed property name</param>
        /// <param name="associationKeyValue">The value of the content association key for the current item</param>
        /// <param name="languageManagedPropertyName">The language search managed property name</param>
        /// <param name="catalogNavigationTermManagedPropertyName">The navigation search managed property name used for the friendly url generation</param>
        /// <returns>The url of the peer page</returns>
        public Uri GetPeerCatalogItemUrl(
            Uri currentUrl,
            VariationLabelInfo label,
            string associationKeyManagedPropertyName,
            string associationKeyValue,
            string languageManagedPropertyName,
            string catalogNavigationTermManagedPropertyName)
        {
            ValidateProperties("GetPeerCatalogItemUrl", associationKeyManagedPropertyName, associationKeyValue, catalogNavigationTermManagedPropertyName);

            var url = new Uri(Variations.GetPeerUrl(SPContext.Current.Web, currentUrl.AbsolutePath, label.Title), UriKind.Relative);

            var searchResultSource = this.searchHelper.GetResultSourceByName(SPContext.Current.Site, LocalSharePointResultsSourceName, SearchObjectLevel.Ssa);

            var queryText = string.Format(
                CultureInfo.InvariantCulture,
                "{0}:{1} {2}:{3}",
                associationKeyManagedPropertyName,
                associationKeyValue,
                languageManagedPropertyName,
                label.Locale);

            var query = new KeywordQuery(SPContext.Current.Web)
            {
                SourceId  = searchResultSource.Id,
                QueryText = queryText
            };

            // Search query must include the following properties for the friendly URL to work
            query.SelectProperties.AddRange(new[]
            {
                catalogNavigationTermManagedPropertyName,
                BuiltInManagedProperties.Url.Name,
                BuiltInManagedProperties.SiteUrl.Name,
                BuiltInManagedProperties.ListId.Name
            });
            var tables = new SearchExecutor().ExecuteQuery(query);

            if (tables.Exists(KnownTableTypes.RelevantResults))
            {
                var table = tables.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
                if (table != null && table.ResultRows.Count == 1 && table.Table.Columns.Contains(BuiltInManagedProperties.Url.Name))
                {
                    url = new Uri(table.Table.Rows[0][BuiltInManagedProperties.Url.Name].ToString(), UriKind.Absolute);

                    // Convert the absolute Uri into a relative Uri. This is required for environments using a load balancer,
                    // because we need to ignore the load balancer's port found in the absolute Uri.
                    url = new Uri(url.AbsolutePath, UriKind.Relative);
                }
            }

            return(url);
        }
Пример #35
0
 public WhereExpressionScope(KeywordQueryCamlVisitor visitor, CamlLogicalOperator currentOperator)
 {
     if (!visitor.whereExpressionScope)
     {
         visitor.whereExpressionScope = true;
         this.query        = visitor.query;
         this.queryBuilder = visitor.queryBuilder;
     }
     this.previousOperator   = visitor.currentOperater;
     this.visitor            = visitor;
     visitor.currentOperater = currentOperator == CamlLogicalOperator.Not ? previousOperator : currentOperator;
 }
        protected override void ExecuteCmdlet()
        {
            var keywordQuery = new KeywordQuery(ClientContext);

            // Construct query to execute
            var query = "contentclass:STS_Site";
            if(!string.IsNullOrEmpty(Query))
            {
                query = query + " AND " + Query;
            }

            keywordQuery.QueryText = query;
            keywordQuery.RowLimit = MaxResults;
            keywordQuery.StartRow = StartRow;
            keywordQuery.SelectProperties.Add("Title");
            keywordQuery.SelectProperties.Add("SPSiteUrl");
            keywordQuery.SelectProperties.Add("Description");
            keywordQuery.SelectProperties.Add("WebTemplate");
            keywordQuery.SortList.Add("SPSiteUrl", SortDirection.Ascending);
            SearchExecutor searchExec = new SearchExecutor(ClientContext);

            // Important to avoid trimming "similar" site collections
            keywordQuery.TrimDuplicates = false;

            ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
            ClientContext.ExecuteQueryRetry();

            var dynamicList = new List<dynamic>();

            if (results != null)
            {
                if (results.Value[0].RowCount > 0)
                {
                    foreach (var row in results.Value[0].ResultRows)
                    {
                        dynamicList.Add(
                            new {
                                Title = row["Title"] != null ? row["Title"].ToString() : "",
                                Url = row["SPSiteUrl"] != null ? row["SPSiteUrl"].ToString() : "",
                                Description = row["Description"] != null ? row["Description"].ToString() : "",
                                WebTemplate = row["WebTemplate"] != null ? row["WebTemplate"].ToString() : ""
                            });
                    }
                }
            }

            WriteObject(dynamicList, true);
        }
Пример #37
0
 /// <summary>
 /// Adds date refinement filter to the keyword query object
 /// </summary>        
 /// <param name="keywordQuery">The keyword query</param>
 /// <param name="fromDate">From date</param>
 /// <param name="toDate">To date</param>
 /// <param name="managedProperty">Managed property name</param>
 /// <returns>Returns a keyword query object</returns>
 internal static KeywordQuery AddDateRefinementFilter(KeywordQuery keywordQuery, string fromDate, string toDate, string managedProperty)
 {
     if (!string.IsNullOrWhiteSpace(fromDate) && !string.IsNullOrWhiteSpace(toDate))
     {
         keywordQuery.RefinementFilters.Add(string.Concat(managedProperty, ConstantStrings.COLON, ConstantStrings.OperatorRange, ConstantStrings.OpeningBracket, fromDate, ConstantStrings.Comma, toDate, ConstantStrings.ClosingBracket));
     }
     else if (string.IsNullOrWhiteSpace(fromDate) && !string.IsNullOrWhiteSpace(toDate))
     {
         keywordQuery.RefinementFilters.Add(string.Concat(managedProperty, ConstantStrings.COLON, ConstantStrings.OperatorRange, ConstantStrings.OpeningBracket, ConstantStrings.MinDate, ConstantStrings.Comma, toDate, ConstantStrings.ClosingBracket));
     }
     else if (!string.IsNullOrWhiteSpace(fromDate) && string.IsNullOrWhiteSpace(toDate))
     {
         keywordQuery.RefinementFilters.Add(string.Concat(managedProperty, ConstantStrings.COLON, ConstantStrings.OperatorRange, ConstantStrings.OpeningBracket, fromDate, ConstantStrings.Comma, ConstantStrings.MaxDate, ConstantStrings.ClosingBracket));
     }
     return keywordQuery;
 }
        public async void LoadResults(string siteUrl, string keywords, string login, string mdp)
        {
            ObservableCollection<CortanaItem> cortanaResults = new ObservableCollection<CortanaItem>();

            keywords = keywords.Trim('.').ToLower();

            try
            {
                using (ClientContext context = new ClientContext(siteUrl))
                {
                    SharePointOnlineCredentials credentials = new SharePointOnlineCredentials(login, mdp);
                    context.Credentials = credentials;

                    KeywordQuery keywordQuery = new KeywordQuery(context);
                    keywordQuery.QueryText = keywords;
                    keywordQuery.SourceId = new Guid(SettingsValues.SourceId);
                    keywordQuery.EnablePhonetic = true;
                    keywordQuery.EnableStemming = true;
                    keywordQuery.RowLimit = 100;

                    SearchExecutor searchExecutor = new SearchExecutor(context);

                    ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);

                    context.ExecuteQueryAsync().Wait();

                    foreach (var item in results.Value[0].ResultRows)
                    {
                        CortanaItem ci = new CortanaItem();
                        ci.Id = item["ID"] != null ? item["ID"].ToString() : string.Empty;
                        ci.Title = item["Title"] != null ? item["Title"].ToString() : string.Empty;
                        ci.LastModifiedDate = item["Modified"] != null ? item["Modified"].ToString() : string.Empty;
                        ci.Url = item["Path"] != null ? item["Path"].ToString() : string.Empty;
                        cortanaResults.Add(ci);
                    }
                }

                LoadDataCompleted(cortanaResults); // Fire event DataLoadCompleted

            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Erreur : " + ex.Message);
                LoadDataCompleted(null);
            }
        }
Пример #39
0
        //
        static void Main(string[] args) {
            //
            using (ClientContext context = new ClientContext(global::VS13.Properties.Settings.Default.SharePointServerUrl)) {
                //
                KeywordQuery query = new KeywordQuery(context);
                query.StartRow = 0;
                query.RowLimit = 500;
                query.EnableStemming = true;
                query.TrimDuplicates = false;
                //query.QueryText = "tiff";
                query.QueryText = "scope:\"All Sites\" AND contentclass:\"STS_ListItem_DocumentLibrary\" AND IsDocument:\"True\" AND Created:2013-08-05";
                query.SelectProperties.Add("scope");
                query.SelectProperties.Add("contentclass");
                query.SelectProperties.Add("IsDocument");
                query.SelectProperties.Add("DAV:displayname");
                query.SelectProperties.Add("DAV:href");
                query.SelectProperties.Add("TBBARCODEOWSTEXT");
                query.SelectProperties.Add("BatchDateOWSDATE");
                query.SelectProperties.Add("Created");

                ClientResult<ResultTableCollection> results = new SearchExecutor(context).ExecuteQuery(query);
                context.ExecuteQuery();
                foreach (IDictionary result in results.Value[0].ResultRows) {
                    Console.WriteLine("{0}: {1}","scope",result["scope"]);
                    Console.WriteLine("{0}: {1}","contentclass",result["contentclass"]);
                    Console.WriteLine("{0}: {1}","IsDocument",result["IsDocument"]);
                    Console.WriteLine("{0}: {1}","DAV:displayname",result["DAV:displayname"]);
                    Console.WriteLine("{0}: {1}","DAV:href",result["DAV:href"]);
                    Console.WriteLine("{0}: {1}","BOLNumOWSTEXT",result["BOLNumOWSTEXT"]);
                    Console.WriteLine("{0}: {1}","BatchDateOWSDATE",result["BatchDateOWSDATE"]);
                    Console.WriteLine("{0}: {1}","Created",result["Created"]);
                    Console.WriteLine("{0}: {1}","Title",result["Title"]);
                    Console.WriteLine("{0}: {1}","Path",result["Path"]);
                    Console.WriteLine("{0}: {1}","Description",result["Description"]);
                }
                Console.ReadLine();
            }
        }
        /// <summary>
        /// Get the peer url for a page represents a cross site publishing catalog item 
        /// </summary>
        /// <param name="currentUrl">The current page url</param>
        /// <param name="label">The target label to resolve</param>
        /// <param name="associationKeyManagedPropertyName">The content association key search managed property name</param>
        /// <param name="associationKeyValue">The value of the content association key for the current item</param>
        /// <param name="languageManagedPropertyName">The language search managed property name</param>
        /// <param name="catalogNavigationTermManagedPropertyName">The navigation search managed property name used for the friendly url generation</param>
        /// <returns>The url of the peer page</returns>
        public Uri GetPeerCatalogItemUrl(
            Uri currentUrl, 
            VariationLabelInfo label, 
            string associationKeyManagedPropertyName, 
            string associationKeyValue, 
            string languageManagedPropertyName, 
            string catalogNavigationTermManagedPropertyName)
        {
            ValidateProperties("GetPeerCatalogItemUrl", associationKeyManagedPropertyName, associationKeyValue, catalogNavigationTermManagedPropertyName);

            var url = new Uri(Variations.GetPeerUrl(SPContext.Current.Web, currentUrl.AbsolutePath, label.Title), UriKind.Relative);

            var searchResultSource = this.searchHelper.GetResultSourceByName(SPContext.Current.Site, LocalSharePointResultsSourceName, SearchObjectLevel.Ssa);

            var queryText = string.Format(
                CultureInfo.InvariantCulture,
                "{0}:{1} {2}:{3}",
                associationKeyManagedPropertyName,
                associationKeyValue,
                languageManagedPropertyName,
                label.Language);

            var query = new KeywordQuery(SPContext.Current.Web)
            {
                SourceId = searchResultSource.Id,
                QueryText = queryText
            };

            // Search query must include the following properties for the friendly URL to work
            query.SelectProperties.AddRange(new[]
            {
                catalogNavigationTermManagedPropertyName,
                BuiltInManagedProperties.Url.Name,
                BuiltInManagedProperties.SiteUrl.Name,
                BuiltInManagedProperties.ListId.Name
            });
            var tables = new SearchExecutor().ExecuteQuery(query);
            if (tables.Exists(KnownTableTypes.RelevantResults))
            {
                var table = tables.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
                if (table != null && table.ResultRows.Count == 1 && table.Table.Columns.Contains(BuiltInManagedProperties.Url.Name))
                {
                    url = new Uri(table.Table.Rows[0][BuiltInManagedProperties.Url.Name].ToString(), UriKind.Absolute);

                    // Convert the absolute Uri into a relative Uri. This is required for environments using a load balancer,
                    // because we need to ignore the load balancer's port found in the absolute Uri.
                    url = new Uri(url.AbsolutePath, UriKind.Relative);
                }
            }

            return url;
        }
Пример #41
0
        public ClientResult<ResultTableCollection> ExecuteSearchQuery(
            string query, string sorting = null, string rankModel = null)
        {
            var keywordQuery = new KeywordQuery(_clientContext){ QueryText = query};

            // Ranking model to use
            if (!String.IsNullOrEmpty(rankModel))
                keywordQuery.RankingModelId = rankModel;

            // If sorting parameter provided
            if (!String.IsNullOrEmpty(sorting))
                keywordQuery.SortList.Add(sorting, SortDirection.Descending);

            // Select only this properties for documents
            keywordQuery.SelectProperties.Add("Title");
            keywordQuery.SelectProperties.Add("Path");
            keywordQuery.SelectProperties.Add("ServerRedirectedURL");
            keywordQuery.SelectProperties.Add("ModifiedOWSDATE");
            keywordQuery.SelectProperties.Add("ModifiedBy");
            keywordQuery.SelectProperties.Add("CreatedOWSDATE");
            keywordQuery.SelectProperties.Add("CreatedBy");
            keywordQuery.SelectProperties.Add("SPWebUrl");
            keywordQuery.SelectProperties.Add("Rank");
            keywordQuery.SelectProperties.Add("LastModifiedTime");

            // Select only this properties for tasks
            keywordQuery.SelectProperties.Add("StatusOWSCHCS");
            keywordQuery.SelectProperties.Add("PercentCompleteOWSNMBR");
            keywordQuery.SelectProperties.Add("AssignedTo");
            keywordQuery.SelectProperties.Add("DueDateOWSDATE");
            keywordQuery.SelectProperties.Add("StartDateOWSDATE");


            // Select only this properties for events
            keywordQuery.SelectProperties.Add("EventDateOWSDATE");
            keywordQuery.SelectProperties.Add("EndDateOWSDATE");

            var searchExecutor = new SearchExecutor(_clientContext);
            var results = searchExecutor.ExecuteQuery(keywordQuery);
            return results;
        }
        private List<string> GetMemberSites()
        {
            var siteUri = new Uri(ConfigurationManager.AppSettings["SiteCollectionRequests_SiteUrl"]);

            using (var context = this.contextFactory.GetContext(siteUri.ToString()))
            {
                var keywordQuery = new KeywordQuery(context);
                keywordQuery.QueryText = "rdoyle AND SiteGroup:\"Team\"";
                keywordQuery.TrimDuplicates = false;
                var searchExecutor = new SearchExecutor(context);
                var results = searchExecutor.ExecuteQuery(keywordQuery);
                context.ExecuteQuery();
            }

            return new List<string>();
        }
Пример #43
0
        /// <summary>
        /// Returns the site collections that comply with the passed keyword query
        /// </summary>
        /// <param name="web">Site to be processed - can be root web or sub site</param>
        /// <param name="keywordQueryValue">Keyword query</param>
        /// <returns>All found site collections</returns>
        public static List<SiteEntity> SiteSearch(this Web web, string keywordQueryValue)
        {
            try
            {
                LoggingUtility.Internal.TraceVerbose("Site search '{0}'", keywordQueryValue);

                List<SiteEntity> sites = new List<SiteEntity>();

                KeywordQuery keywordQuery = new KeywordQuery(web.Context);
                keywordQuery.TrimDuplicates = false;

                if (keywordQueryValue.Length == 0)
                {
                    keywordQueryValue = "contentclass:\"STS_Site\"";
                }

                int startRow = 0;
                int totalRows = 0;

                totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);

                if (totalRows > 0)
                {
                    while (totalRows >= sites.Count)
                    {
                        startRow += 500;
                        totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);
                    }
                }

                return sites;
            }
            catch (Exception ex)
            {
                LoggingUtility.Internal.TraceError((int)EventId.SiteSearchUnhandledException, ex, "Site search error.");
                // rethrow does lose one line of stack trace, but we want to log the error at the component boundary
                throw;
            }
        }
Пример #44
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cc">ClientContext object of an arbitrary site collection accessible by the defined enumeration username and password</param>
        /// <param name="keywordQueryValue">Query to execute</param>
        /// <param name="sites">List of found site collections</param>
        /// <param name="keywordQuery">KeywordQuery instance that will perform the actual queries</param>
        /// <param name="startRow">Row as of which we want to see the results</param>
        /// <returns>Total result rows of the query</returns>
        private static int ProcessQuery(ClientRuntimeContext cc, string keywordQueryValue, List<string> sites, KeywordQuery keywordQuery, int startRow)
        {
            int totalRows = 0;

            keywordQuery.QueryText = keywordQueryValue;
            keywordQuery.RowLimit = 500;
            keywordQuery.StartRow = startRow;
            keywordQuery.SelectProperties.Add("SPSiteUrl");
            keywordQuery.SortList.Add("SPSiteUrl", SortDirection.Ascending);
            SearchExecutor searchExec = new SearchExecutor(cc);
            ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
            cc.ExecuteQueryRetry();

            if (results != null)
            {
                if (results.Value[0].RowCount > 0)
                {
                    totalRows = results.Value[0].TotalRows;

                    foreach (var row in results.Value[0].ResultRows)
                    {
                        if (row["SPSiteUrl"] != null)
                        {
                            sites.Add(row["SPSiteUrl"].ToString());
                        }
                    }
                }
            }

            return totalRows;
        }
Пример #45
0
 /// <summary>
 /// Defines the sorting property and direction for querying SharePoint Search.
 /// </summary>
 /// <param name="keywordQuery">Keyword object</param>
 /// <param name="searchObject">Search object</param>
 /// <param name="isMatterSearch">Boolean flag which determines current search is for matters or documents</param>
 /// <returns></returns>
 internal static KeywordQuery GetSortByProperty(KeywordQuery keywordQuery, SearchObject searchObject, Boolean isMatterSearch)
 {
     string matterIDRefiner = string.Empty;
     ////Sorting by specified property  0 --> Ascending order and 1 --> Descending order
     if (!string.IsNullOrWhiteSpace(searchObject.Sort.ByProperty))
     {
         keywordQuery = AddSortingRefiner(keywordQuery, searchObject.Sort.ByProperty, searchObject.Sort.Direction);
         //// Add Matter ID property as second level sort for Client.MatterID column based on Search Matter or Search Document
         if (SearchConstants.ManagedPropertyClientID == searchObject.Sort.ByProperty || SearchConstants.ManagedPropertyDocumentClientId == searchObject.Sort.ByProperty)
         {
             if (isMatterSearch)
             {
                 matterIDRefiner = SearchConstants.ManagedPropertyMatterId;
             }
             else
             {
                 matterIDRefiner = SearchConstants.ManagedPropertyDocumentMatterId;
             }
             keywordQuery = AddSortingRefiner(keywordQuery, matterIDRefiner, searchObject.Sort.Direction);
         }
     }
     return keywordQuery;
 }
Пример #46
0
        /// <summary>
        /// Fires query on SharePoint Search and fills the result data.
        /// </summary>
        /// <param name="clientContext">The client context.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <param name="searchObject">The search object.</param>
        /// <param name="isMatterSearch">The flag to determine weather call is from Search Matter or Search Document.</param>
        /// <param name="managedProperties">List of managed properties</param>
        /// <returns>It returns a string object, that contains all the results combined with dollar pipe dollar separator.</returns>
        internal static string FillResultData(ClientContext clientContext, KeywordQuery keywordQuery, SearchObject searchObject, Boolean isMatterSearch, List<string> managedProperties)
        {
            string result = string.Empty;
            Boolean isReadOnly;
            try
            {
                if (null != searchObject.Sort)
                {
                    keywordQuery.EnableSorting = true;
                    keywordQuery = SearchHelperFunctions.GetSortByProperty(keywordQuery, searchObject, isMatterSearch);
                }
                SearchExecutor searchExecutor = new SearchExecutor(clientContext);
                ClientResult<ResultTableCollection> resultsTableCollection = searchExecutor.ExecuteQuery(keywordQuery);
                Users currentLoggedInUser = UIUtility.GetLoggedInUserDetails(clientContext);

                if (null != resultsTableCollection && null != resultsTableCollection.Value && 0 < resultsTableCollection.Value.Count && null != resultsTableCollection.Value[0].ResultRows)
                {
                    if (isMatterSearch && 0 < resultsTableCollection.Value.Count && null != resultsTableCollection.Value[0].ResultRows && (!string.IsNullOrWhiteSpace(currentLoggedInUser.Name) || !string.IsNullOrWhiteSpace(currentLoggedInUser.Email)))
                    {
                        foreach (IDictionary<string, object> matterMetadata in resultsTableCollection.Value[0].ResultRows)
                        {
                            isReadOnly = false;
                            if (null != matterMetadata)
                            {
                                // Decode matter properties
                                DecodeMatterProperties(matterMetadata);
                                string readOnlyUsers = Convert.ToString(matterMetadata[SearchConstants.ManagedPropertyBlockedUploadUsers], CultureInfo.InvariantCulture);
                                if (!string.IsNullOrWhiteSpace(readOnlyUsers))
                                {
                                    isReadOnly = IsUserReadOnlyForMatter(isReadOnly, currentLoggedInUser.Name, currentLoggedInUser.Email, readOnlyUsers);
                                }
                                matterMetadata.Add(TextConstants.IsReadOnlyUser, isReadOnly);
                            }
                        }
                    }
                    else
                    {
                        /*Keeping the code to clean the author values*/
                        foreach (IDictionary<string, object> documentMetadata in resultsTableCollection.Value[0].ResultRows)
                        {
                            if (null != documentMetadata)
                            {
                                string authorData = Convert.ToString(documentMetadata[SearchConstants.ManagedPropertyAuthor], CultureInfo.InvariantCulture);
                                int ltIndex = authorData.IndexOf(ConstantStrings.OpeningAngularBracket, StringComparison.Ordinal);
                                int gtIndex = authorData.IndexOf(ConstantStrings.ClosingAngularBracket, StringComparison.Ordinal);
                                authorData = (0 <= ltIndex && ltIndex < gtIndex) ? authorData.Remove(ltIndex, (gtIndex - ltIndex) + 1) : authorData;
                                authorData = authorData.Replace(ServiceConstantStrings.DoubleQuotes, string.Empty);
                                documentMetadata[SearchConstants.ManagedPropertyAuthor] = authorData.Trim();
                            }
                        }
                    }
                    if (1 < resultsTableCollection.Value.Count)
                    {
                        result = string.Concat(JsonConvert.SerializeObject(resultsTableCollection.Value[0].ResultRows), ConstantStrings.DOLLAR, ConstantStrings.Pipe, ConstantStrings.DOLLAR, resultsTableCollection.Value[0].TotalRows, ConstantStrings.DOLLAR, ConstantStrings.Pipe, ConstantStrings.DOLLAR, JsonConvert.SerializeObject(resultsTableCollection.Value[1].ResultRows));
                    }
                    else
                    {
                        if (0 == resultsTableCollection.Value[0].TotalRows)
                        {
                            result = SearchHelperFunctions.NoDataRow(managedProperties);
                        }
                        else
                        {
                            result = string.Concat(JsonConvert.SerializeObject(resultsTableCollection.Value[0].ResultRows), ConstantStrings.DOLLAR, ConstantStrings.Pipe, ConstantStrings.DOLLAR, resultsTableCollection.Value[0].TotalRows);
                        }
                    }
                }
                else
                {
                    result = SearchHelperFunctions.NoDataRow(managedProperties);
                }
            }
            catch (Exception exception)
            {
                result = Logger.LogError(exception, MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name, ServiceConstantStrings.LogTableName);
            }
            return result;
        }
Пример #47
0
        /// <summary>
        /// This method executes te search api to get most popular items from the current site
        /// </summary>
        /// <param name="clientContext"></param>
        /// <param name="propListName"></param>
        /// <param name="errMSG"></param>
        /// <returns></returns>
        public static string GetFAQFromSearchAPI(string propListName, string errMSG)
        {
            string mostPopular = string.Empty;
            try
            {
                Web oWeb = clientContext.Web;
                clientContext.Load(oWeb);
                clientContext.ExecuteQuery();
                KeywordQuery keywordQuery = new KeywordQuery(clientContext);
                Uri uri = new Uri(oWeb.Url.ToString());
                string urlPath = System.Web.HttpUtility.UrlPathEncode(uri.GetLeftPart(UriPartial.Authority) + GetListUrlByTitle(propListName)[0]);
                string actualURL = string.Format(@"path:{0}", urlPath);
                StringCollection selectProperties = keywordQuery.SelectProperties;
                selectProperties.Add("LastModifiedTime");
                selectProperties.Add("ContentTypeId");
                selectProperties.Add("Title");
                selectProperties.Add("Answer");
                keywordQuery.QueryText = actualURL;
                SearchExecutor searchExecutor = new SearchExecutor(clientContext);
                ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
                clientContext.ExecuteQuery();
                mostPopular = GenerateFAQHTML(results, errMSG);
            }
            catch (Exception ex)
            {
                mostPopular = errMSG;
                Logger.WriteLog(Logger.Category.Unexpected, string.Format("{0}-{1}", "CommonHelper", "GetFAQFromSearchAPI"), ex.StackTrace);
            }

            return mostPopular;
        }
Пример #48
0
        /// <summary>
        /// Prepares and returns the query to filter the documents.
        /// </summary>
        /// <param name="searchObject">The search object.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <returns>It returns a Keyword Query object.</returns>
        internal static KeywordQuery FilterDocuments(SearchObject searchObject, KeywordQuery keywordQuery)
        {
            string filterValues = string.Empty;
            if (null != searchObject && null != keywordQuery)
            {
                if (null != searchObject.Filters)
                {
                    keywordQuery = AddDateRefinementFilter(keywordQuery, searchObject.Filters.FromDate, searchObject.Filters.ToDate, SearchConstants.ManagedPropertyCreated);
                    if (null != searchObject.Filters.DocumentAuthor && !string.IsNullOrWhiteSpace(searchObject.Filters.DocumentAuthor))
                    {
                        keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyAuthor, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.DocumentAuthor, ConstantStrings.DoubleQuote));
                    }

                    if (0 < searchObject.Filters.ClientsList.Count && !string.IsNullOrWhiteSpace(searchObject.Filters.ClientsList[0]))
                    {
                        filterValues = SearchHelperFunctions.FormFilterQuery(SearchConstants.ManagedPropertyDocumentClientName, searchObject.Filters.ClientsList);
                        keywordQuery.RefinementFilters.Add(filterValues);
                    }

                    /* New refinement filters for list view control */

                    if (!string.IsNullOrWhiteSpace(searchObject.Filters.Name))
                    {
                        keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyFileName, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.Name, ConstantStrings.DoubleQuote));
                    }

                    if (!string.IsNullOrWhiteSpace(searchObject.Filters.ClientName))
                    {
                        keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyDocumentClientName, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.ClientName, ConstantStrings.DoubleQuote));
                    }

                    if (null != searchObject.Filters.DocumentCheckoutUsers && !string.IsNullOrWhiteSpace(searchObject.Filters.DocumentCheckoutUsers))
                    {
                        keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyDocumentCheckOutUser, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.DocumentCheckoutUsers, ConstantStrings.DoubleQuote));
                    }
                }
                keywordQuery = FilterCommonDetails(searchObject, keywordQuery, false);
            }
            return keywordQuery;
        }
Пример #49
0
        /// <summary>
        /// Returns the query to filter the matters/ documents for common filters.
        /// </summary>
        /// <param name="searchObject">The search object.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <param name="isMatterView">Flag to identify matters/documents view.</param>
        /// <returns>It returns a keyword query object.</returns>
        internal static KeywordQuery FilterCommonDetails(SearchObject searchObject, KeywordQuery keywordQuery, bool isMatterView)
        {
            if (null != searchObject && null != keywordQuery)
            {

                if (null != searchObject.Filters.DateFilters)
                {
                    string lastModifiedTime = SearchConstants.ManagedPropertyLastModifiedTime;
                    //// Add refiner for Modified date value
                    if (!isMatterView)
                    {
                        lastModifiedTime = SearchConstants.ManagedPropertyDocumentLastModifiedTime;
                    }
                    keywordQuery = AddDateRefinementFilter(keywordQuery, searchObject.Filters.DateFilters.ModifiedFromDate, searchObject.Filters.DateFilters.ModifiedToDate, lastModifiedTime);

                    ////// Add refiner for Created date value
                    keywordQuery = AddDateRefinementFilter(keywordQuery, searchObject.Filters.DateFilters.CreatedFromDate, searchObject.Filters.DateFilters.CreatedToDate, SearchConstants.ManagedPropertyCreated);
                }
            }
            return keywordQuery;
        }
Пример #50
0
 /// <summary>
 /// Assigns the keyword query values.
 /// </summary>
 /// <param name="keywordQuery">The keyword query.</param>
 /// <param name="managedProperties">The managed properties.</param>
 /// <returns>It returns a Keyword Query object.</returns>
 internal static KeywordQuery AssignKeywordQueryValues(KeywordQuery keywordQuery, List<string> managedProperties)
 {
     KeywordQuery result = null;
     if (keywordQuery != null)
     {
         keywordQuery.SelectProperties.Clear();
         foreach (string selectProperties in managedProperties)
         {
             keywordQuery.SelectProperties.Add(selectProperties);
         }
         result = keywordQuery;
     }
     else
     {
         result = null;
     }
     return result;
 }
Пример #51
0
        /// <summary>
        /// Returns the query to filter the matters.
        /// </summary>
        /// <param name="searchObject">The search object.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <returns>It returns a keyword query object.</returns>
        internal static KeywordQuery FilterMatters(SearchObject searchObject, KeywordQuery keywordQuery)
        {
            string filterValues = string.Empty;
            if (null != searchObject && null != keywordQuery)
            {
                if (null != searchObject.Filters)
                {
                    if (null != searchObject.Filters.AOLList && 0 < searchObject.Filters.AOLList.Count && !string.IsNullOrWhiteSpace(searchObject.Filters.AOLList[0]))
                    {
                        filterValues = SearchHelperFunctions.FormFilterQuery(SearchConstants.ManagedPropertyAreaOfLaw, searchObject.Filters.AOLList);
                        keywordQuery.RefinementFilters.Add(filterValues);
                    }

                    if (null != searchObject.Filters.PGList && 0 < searchObject.Filters.PGList.Count && !string.IsNullOrWhiteSpace(searchObject.Filters.PGList[0]))
                    {
                        filterValues = SearchHelperFunctions.FormFilterQuery(SearchConstants.ManagedPropertyPracticeGroup, searchObject.Filters.PGList);
                        keywordQuery.RefinementFilters.Add(filterValues);
                    }
                    keywordQuery = AddDateRefinementFilter(keywordQuery, searchObject.Filters.FromDate, searchObject.Filters.ToDate, SearchConstants.ManagedPropertyOpenDate);
                    if (null != searchObject.Filters.ClientsList && 0 < searchObject.Filters.ClientsList.Count && !string.IsNullOrWhiteSpace(searchObject.Filters.ClientsList[0]))
                    {
                        filterValues = SearchHelperFunctions.FormFilterQuery(SearchConstants.ManagedPropertyClientName, searchObject.Filters.ClientsList);
                        keywordQuery.RefinementFilters.Add(filterValues);
                    }
                }

                keywordQuery = FilterMattersUtility(searchObject, keywordQuery);

                keywordQuery = SearchHelperFunctions.FilterCommonDetails(searchObject, keywordQuery, true);
            }
            return keywordQuery;
        }
Пример #52
0
        /// <summary>
        /// Prepares and returns the keyword query to get data from SharePoint Search based on filtering condition.
        /// </summary>
        /// <param name="client">The client object</param>
        /// <param name="searchObject">The search object.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <param name="filterCondition">The filter condition.</param>
        /// <param name="managedProperty">The managed property.</param>
        /// <param name="isMatterView">If the user is pinning a matter, this will be true, else will be false.</param>
        /// <returns>It returns a Keyword Query object.</returns>
        internal static KeywordQuery KeywordQueryMetrics(Client client, SearchObject searchObject, KeywordQuery keywordQuery, string filterCondition, string managedProperty, bool isMatterView)
        {
            KeywordQuery result = null;
            try
            {
                if (ServiceConstantStrings.IsTenantDeployment)
                {
                    keywordQuery.QueryText = searchObject.SearchTerm;
                }
                else
                {
                    keywordQuery.QueryText = "(" + searchObject.SearchTerm + " AND site:" + client.Url + ")";
                }

                keywordQuery.RefinementFilters.Add(filterCondition);
                if (isMatterView)
                {
                    keywordQuery.RefinementFilters.Add(string.Concat(managedProperty, ConstantStrings.COLON, ConstantStrings.DoubleQuote, true, ConstantStrings.DoubleQuote));
                }
                else
                {

                    string[] invalidExtensions = ServiceConstantStrings.FindDocumentInvalidExtensions.Split(',');
                    string chunk = string.Empty;

                    foreach (string extension in invalidExtensions)
                    {
                        chunk = chunk + "equals" + ConstantStrings.OpeningBracket + ConstantStrings.DoubleQuote + extension + ConstantStrings.DoubleQuote + ConstantStrings.ClosingBracket + ConstantStrings.Comma;
                    }
                    chunk = chunk.Remove(chunk.Length - 1);

                    keywordQuery.RefinementFilters.Add(string.Concat("not" + ConstantStrings.OpeningBracket + "FileType", ConstantStrings.COLON, ConstantStrings.OperatorOR + ConstantStrings.OpeningBracket +
                                                                                                            chunk + ConstantStrings.ClosingBracket + ConstantStrings.ClosingBracket
                                                                                                            ));
                    keywordQuery.RefinementFilters.Add(string.Concat(managedProperty, ConstantStrings.COLON, "equals", ConstantStrings.OpeningBracket + ConstantStrings.DoubleQuote +
                                                                                                            "1" + ConstantStrings.DoubleQuote + ConstantStrings.ClosingBracket
                                                                                                            ));
                }

                keywordQuery.TrimDuplicates = false;
                if (0 < searchObject.PageNumber && 0 < searchObject.ItemsPerPage)
                {
                    keywordQuery.StartRow = (searchObject.PageNumber - 1) * searchObject.ItemsPerPage;
                    keywordQuery.RowLimit = searchObject.ItemsPerPage;
                }

                result = keywordQuery;
            }
            catch (Exception exception)
            {
                Logger.LogError(exception, MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name, ServiceConstantStrings.LogTableName);
                result = null;
            }
            return result;
        }
Пример #53
0
        // private methods
        /// <summary>
        /// Runs a query
        /// </summary>
        /// <param name="web">Site to be processed - can be root web or sub site</param>
        /// <param name="keywordQueryValue">keyword query </param>
        /// <param name="sites">sites variable that hold the resulting sites</param>
        /// <param name="keywordQuery">KeywordQuery object</param>
        /// <param name="startRow">Start row of the resultset to be returned</param>
        /// <returns>Total number of rows for the query</returns>
        private static int ProcessQuery(this Web web, string keywordQueryValue, List<SiteEntity> sites, KeywordQuery keywordQuery, int startRow)
        {
            int totalRows = 0;

            keywordQuery.QueryText = keywordQueryValue;
            keywordQuery.RowLimit = 500;
            keywordQuery.StartRow = startRow;
            keywordQuery.SelectProperties.Add("Title");
            keywordQuery.SelectProperties.Add("SPSiteUrl");
            keywordQuery.SelectProperties.Add("Description");
            keywordQuery.SelectProperties.Add("WebTemplate");
            keywordQuery.SortList.Add("SPSiteUrl", SortDirection.Ascending);
            SearchExecutor searchExec = new SearchExecutor(web.Context);

            // Important to avoid trimming "similar" site collections
            keywordQuery.TrimDuplicates = false;

            ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
            web.Context.ExecuteQueryRetry();

            if (results != null)
            {
                if (results.Value[0].RowCount > 0)
                {
                    totalRows = results.Value[0].TotalRows;

                    foreach (var row in results.Value[0].ResultRows)
                    {
                        sites.Add(new SiteEntity
                        {
                            Title = row["Title"] != null ? row["Title"].ToString() : "",
                            Url = row["SPSiteUrl"] != null ? row["SPSiteUrl"].ToString() : "",
                            Description = row["Description"] != null ? row["Description"].ToString() : "",
                            Template = row["WebTemplate"] != null ? row["WebTemplate"].ToString() : "",
                        });
                    }
                }
            }

            return totalRows;
        }
 private DataTable GetItems()
 {
     DataTable resultsDataTable = new DataTable();
     if (tags.Length > 0)
     {
         SPSite site = new SPSite(SPContext.Current.Site.Url);
         /*
         FullTextSqlQuery query = new FullTextSqlQuery(site);
         query.Hint = QueryHint.OptimizeWithPropertyStore;
         // inserito per prendere tutto. BUG della search
         query.TrimDuplicates = false;
         query.QueryText = "SELECT Path, title, Created, Tags, TipoContenuto, SiteTitle, SiteName FROM scope() WHERE \"scope\"='All Sites' AND (CONTAINS(Tags,'\"" + tags[0] + "\"')";
         if (tags.Length > 1)
         {
             for (int i = 1; i < tags.Length; i++)
             {
                 query.QueryText += " OR CONTAINS(Tags,'\"" + tags[i] + "\"')";
             }
         }
         query.QueryText += ") ORDER BY LastModifiedTime Desc";
         query.SiteContext = new Uri(site.Url);
         query.ResultTypes = ResultType.RelevantResults;
          * */
         SearchServiceApplicationProxy proxy =
     (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(SPContext.Current.Site));
         KeywordQuery query = new KeywordQuery(proxy);
         //query.EnableFQL = true;
         query.QueryText = propertyName + ":\"" + tags[0] + "\"";
         if (tags.Length > 1)
         {
             for (int i = 1; i < tags.Length; i++)
             {
                 query.QueryText += " OR " + propertyName + ":\"" + tags[i] + "\"";
             }
         }
         query.ResultsProvider = SearchProvider.Default;
         query.ResultTypes = ResultType.RelevantResults;
         query.StartRow = 0;
         query.RowLimit = 5000;
         query.TrimDuplicates = false;
         query.SelectProperties.Add("Path");
         query.SelectProperties.Add("title");
         query.SelectProperties.Add("Descrizione");
         query.SelectProperties.Add(propertyName);
         query.SelectProperties.Add("TipoContenuto");
         query.SelectProperties.Add("Created");
         query.SelectProperties.Add("SiteTitle");
         query.SelectProperties.Add("SiteName");
         query.SortList.Add("Rank", Microsoft.Office.Server.Search.Query.SortDirection.Descending);
         //
         ResultTableCollection resultTables = query.Execute();
         ResultTable relevantResults = resultTables[ResultType.RelevantResults];
         resultsDataTable.Load(relevantResults, LoadOption.OverwriteChanges);
     }
     return resultsDataTable;
 }
Пример #55
0
        public static List<SiteEntity> SiteSearch(this Web web, string keywordQueryValue, bool trimDublicates = true)
        {
            try
            {
                Log.Debug(Constants.LOGGING_SOURCE, "Site search '{0}'", keywordQueryValue);

                List<SiteEntity> sites = new List<SiteEntity>();

                KeywordQuery keywordQuery = new KeywordQuery(web.Context);
                keywordQuery.TrimDuplicates = false;

                if (keywordQueryValue.Length == 0)
                {
                    keywordQueryValue = "contentclass:\"STS_Site\"";
                }

                int startRow = 0;
                int totalRows = 0;

                totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);

                if (totalRows > 0)
                {
                    while (totalRows >= sites.Count)
                    {
                        startRow += 500;
                        totalRows = web.ProcessQuery(keywordQueryValue, sites, keywordQuery, startRow);
                    }
                }

                return sites;
            }
            catch (Exception ex)
            {
                Log.Error(Constants.LOGGING_SOURCE, CoreResources.WebExtensions_SiteSearchUnhandledException, ex.Message);
                // rethrow does lose one line of stack trace, but we want to log the error at the component boundary
                throw;
            }
        }
Пример #56
0
 private static ResultTableCollection ExecuteKeywordQuery(SPSite site, string queryText)
 {
     SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(site));
     KeywordQuery query = new KeywordQuery(proxy);
     query.ResultsProvider = Microsoft.Office.Server.Search.Query.SearchProvider.Default;
     query.SelectProperties.Add("ItemID");
     query.QueryText = queryText;
     query.ResultTypes |= ResultType.RelevantResults;
     query.RowLimit = 0;
     ResultTableCollection searchResults = query.Execute();
     return searchResults;
     //if (searchResults.Exists(ResultType.RelevantResults))
     //{
     //    ResultTable searchResult = searchResults[ResultType.RelevantResults];
     //    DataTable result = new DataTable();
     //    result.TableName = "Result";
     //    result.Load(searchResult, LoadOption.OverwriteChanges);
     //    FillResultsGrid(result);
     //}
 }
Пример #57
0
        /// <summary>
        /// Get all sites that match the passed query. Batching is done in batches of 500 as this is compliant for both Office 365 as SharePoint on-premises
        /// </summary>
        /// <param name="cc">ClientContext object of an arbitrary site collection accessible by the defined enumeration username and password</param>
        /// <param name="keywordQueryValue">Query string</param>
        /// <returns>List of found site collections</returns>
        private static List<String> SiteSearch(ClientRuntimeContext cc, string keywordQueryValue)
        {
            List<String> sites = new List<String>();

            KeywordQuery keywordQuery = new KeywordQuery(cc);
            // Important to avoid trimming "similar" site collections
            keywordQuery.TrimDuplicates = false;

            if (keywordQueryValue.Length == 0)
            {
                keywordQueryValue = "contentclass:\"STS_Site\"";
            }

            int startRow = 0;
            int totalRows = 0;

            totalRows = ProcessQuery(cc, keywordQueryValue, sites, keywordQuery, startRow);

            if (totalRows > 0)
            {
                while (totalRows >= sites.Count)
                {
                    startRow += 500;
                    totalRows = ProcessQuery(cc, keywordQueryValue, sites, keywordQuery, startRow);
                }
            }

            return sites;
        }
Пример #58
0
        private IEnumerable<NavigationNode> GetNavigationNodesBySearch(SPWeb web, NavigationSearchSettings settings, IEnumerable<string> additionalFilters = null)
        {
            var filters = new List<string>(settings.GlobalFilters);

            // Check if find result source
            var searchResultSource = this.searchHelper.GetResultSourceByName(web.Site, settings.ResultSourceName, SearchObjectLevel.Ssa);
            if (searchResultSource == null)
            {
                this.logger.Error("searchResultSource is null in GSoft.Dynamite.Navigation.NavigationService.GetNavigationNodeItems");
                return new List<NavigationNode>();
            }

            var query = new KeywordQuery(web)
            {
                SourceId = searchResultSource.Id,
                TrimDuplicates = false,
                RowLimit = 500
            };

            // Add defined filters
            if (additionalFilters != null)
            {
                filters.AddRange(additionalFilters);
            }

            if (settings.SelectedProperties != null && settings.SelectedProperties.Any())
            {
                query.SelectProperties.AddRange(settings.SelectedProperties.ToArray());
            }

            // TODO: For now, the filters are applied seperated by whitespaces which means "AND" in KQL land.
            // TODO: We should figure out a way to make this more flexible to use "OR" if necessary.
            query.QueryText = string.Join(" ", filters.Where(filter => !string.IsNullOrEmpty(filter)));

            // Execute search query
            var tables = new SearchExecutor().ExecuteQuery(query);
            if (tables.Exists(KnownTableTypes.RelevantResults))
            {
                // Build navigation nodes for search results
                var results = tables.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
                var nodes = results.Table.Rows.Cast<DataRow>().Select(dataRow => new NavigationNode(dataRow, settings.NavigationManagedPropertyName));
                this.logger.Info(
                    "GetNavigationNodeItems: Found {0} items with search query '{1}' from source '{2}'.",
                    results.Table.Rows.Count,
                    query.QueryText,
                    settings.ResultSourceName);

                return nodes;
            }

            this.logger.Error(
                "GetNavigationNodeItems: No relevant results table found with search query '{0}' from source '{1}'.",
                query.QueryText,
                settings.ResultSourceName);

            return new List<NavigationNode>();
        }
Пример #59
0
        /// <summary>
        /// Returns the query to filter the matters.
        /// </summary>
        /// <param name="searchObject">The search object.</param>
        /// <param name="keywordQuery">The keyword query.</param>
        /// <returns>It returns a keyword query object.</returns>
        internal static KeywordQuery FilterMattersUtility(SearchObject searchObject, KeywordQuery keywordQuery)
        {
            if (null != searchObject && null != keywordQuery && null != searchObject.Filters)
            {
                /* New refinement filters for list view control */
                if (!string.IsNullOrWhiteSpace(searchObject.Filters.Name))
                {
                    keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyMatterName, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.Name, ConstantStrings.DoubleQuote));
                }

                if (!string.IsNullOrWhiteSpace(searchObject.Filters.ClientName))
                {
                    keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyClientName, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.ClientName, ConstantStrings.DoubleQuote));
                }

                if (null != searchObject.Filters.ResponsibleAttorneys && !string.IsNullOrWhiteSpace(searchObject.Filters.ResponsibleAttorneys))
                {
                    keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertyResponsibleAttorney, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.ResponsibleAttorneys, ConstantStrings.DoubleQuote));
                }

                if (!string.IsNullOrWhiteSpace(searchObject.Filters.SubareaOfLaw))
                {
                    keywordQuery.RefinementFilters.Add(string.Concat(SearchConstants.ManagedPropertySubAreaOfLaw, ConstantStrings.COLON, ConstantStrings.DoubleQuote, searchObject.Filters.SubareaOfLaw, ConstantStrings.DoubleQuote));
                }
                if (null != searchObject.Filters.DateFilters)
                {
                    ////// Add refiner for Open date value
                    keywordQuery = AddDateRefinementFilter(keywordQuery, searchObject.Filters.DateFilters.OpenDateFrom, searchObject.Filters.DateFilters.OpenDateTo, SearchConstants.ManagedPropertyOpenDate);
                }
            }

            return keywordQuery;
        }
Пример #60
-1
        private List<string> GetHiddenProjectSites()
        {
            var siteUri = new Uri(ConfigurationManager.AppSettings["SiteCollectionRequests_SiteUrl"]);
            var resultsList = new List<string>();

            using (var context = this.contextFactory.GetContext(siteUri.ToString()))
            {
                var keywordQuery = new KeywordQuery(context);
                keywordQuery.QueryText = "Project AND HiddenSite AND ContentType=\"Site Collection Metadata\"";
                keywordQuery.TrimDuplicates = false;
                keywordQuery.SelectProperties.Clear();
                keywordQuery.SelectProperties.Add("SiteNumFollowers");
                keywordQuery.SelectProperties.Add("SiteTitle");
                keywordQuery.SelectProperties.Add("SiteMembers");
                var searchExecutor = new SearchExecutor(context);
                var results = searchExecutor.ExecuteQuery(keywordQuery);
                context.ExecuteQuery();

                var result = results.Value[0];
                foreach (var res in result.ResultRows)
                {
                    var siteTitle = res["SiteName"];
                    resultsList.Add(siteTitle.ToString());
                }
            }

            return resultsList;
        }