/// <summary> Constructor for a new instance of the Text_Search_ItemViewer class, which allows the full text of an /// individual resource to be searched and individual matching pages are displayed with page thumbnails </summary> /// <param name="BriefItem"> Digital resource object </param> /// <param name="CurrentUser"> Current user, who may or may not be logged on </param> /// <param name="CurrentRequest"> Information about the current request </param> /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering </param> public Text_Search_ItemViewer(BriefItemInfo BriefItem, User_Object CurrentUser, Navigation_Object CurrentRequest, Custom_Tracer Tracer ) { Tracer.Add_Trace("Text_Search_ItemViewer.Constructor"); // Save the arguments for use later this.BriefItem = BriefItem; this.CurrentUser = CurrentUser; this.CurrentRequest = CurrentRequest; // Set the behavior properties to the empy behaviors ( in the base class ) Behaviors = EmptyBehaviors; if (!String.IsNullOrWhiteSpace(CurrentRequest.Text_Search)) { List<string> terms = new List<string>(); List<string> web_fields = new List<string>(); // Split the terms correctly SobekCM_Assistant.Split_Clean_Search_Terms_Fields(CurrentRequest.Text_Search, "ZZ", Search_Type_Enum.Basic, terms, web_fields, null, Search_Precision_Type_Enum.Contains, '|'); Tracer.Add_Trace("Text_Search_ItemViewer.Constructor", "Performing Solr/Lucene search"); int page = CurrentRequest.SubPage.HasValue ? Math.Max(CurrentRequest.SubPage.Value, ((ushort)1)) : 1; results = Solr_Page_Results.Search(BriefItem.BibID, BriefItem.VID, terms, 20, page, false); Tracer.Add_Trace("Text_Search_ItemViewer.Constructor", "Completed Solr/Lucene search in " + results.QueryTime + "ms"); } }
/// <summary> Perform an in-document search for pages with matching full-text </summary> /// <param name="BibID"> Bibliographic identifier (BibID) for the item to search </param> /// <param name="VID"> Volume identifier for the item to search </param> /// <param name="Search_Terms"> Terms to search for within the page text </param> /// <param name="ResultsPerPage"> Number of results to display per a "page" of results </param> /// <param name="ResultsPage"> Which page of results to return ( one-based, so the first page is page number of one )</param> /// <param name="Sort_By_Score"> Flag indicates whether to sort the results by relevancy score, rather than the default page order </param> /// <returns> Page search result object with all relevant result information </returns> public static Solr_Page_Results Search(string BibID, string VID, List<string> Search_Terms, int ResultsPerPage, int ResultsPage, bool Sort_By_Score) { // Ensure page is not erroneously set to zero or negative if (ResultsPage <= 0) ResultsPage = 1; // Create the solr worker to query the page index var solrWorker = Solr_Operations_Cache<Solr_Page_Result>.GetSolrOperations(Engine_ApplicationCache_Gateway.Settings.Servers.Page_Solr_Index_URL); // Create the query options QueryOptions options = new QueryOptions { Rows = ResultsPerPage, Start = (ResultsPage - 1) * ResultsPerPage, Fields = new [] { "pageid", "pagename", "pageorder", "score", "thumbnail" }, Highlight = new HighlightingParameters { Fields = new[] { "pagetext" }, }, ExtraParams = new Dictionary<string, string> { { "hl.useFastVectorHighlighter", "true" } } }; // If this is not the default Solr sort (by score) request sort by the page order if (!Sort_By_Score) options.OrderBy = new[] { new SortOrder("pageorder", Order.ASC) }; // Build the query string StringBuilder queryStringBuilder = new StringBuilder("(bibid:" + BibID + ")AND(vid:" + VID + ")AND("); bool first_value = true; foreach (string searchTerm in Search_Terms) { if (searchTerm.Length > 1) { // Skip any AND NOT for now if (searchTerm[0] != '-') { // Find the joiner if (first_value) { if (searchTerm.IndexOf(" ") > 0) { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Substring(1).Replace(":","") + "\")" ); } else { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Replace(":", "") + "\")"); } } else { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append("(pagetext:" + searchTerm.Substring(1).Replace(":", "") + ")"); } else { queryStringBuilder.Append("(pagetext:" + searchTerm.Replace(":", "") + ")"); } } first_value = false; } else { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append(searchTerm[0] == '=' ? " OR " : " AND "); if (searchTerm.IndexOf(" ") > 0) { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Substring(1).Replace(":", "") + "\")"); } else { queryStringBuilder.Append("(pagetext:" + searchTerm.Substring(1).Replace(":", "") + ")"); } } else { if (searchTerm.IndexOf(" ") > 0) { queryStringBuilder.Append(" AND (pagetext:\"" + searchTerm.Replace(":", "") + "\")"); } else { queryStringBuilder.Append(" AND (pagetext:" + searchTerm.Replace(":", "") + ")"); } } } } } } queryStringBuilder.Append(")"); // Perform this search SolrQueryResults<Solr_Page_Result> results = solrWorker.Query(queryStringBuilder.ToString(), options); // Create the results object to pass back out var searchResults = new Solr_Page_Results { QueryTime = results.Header.QTime, TotalResults = results.NumFound, Query = queryStringBuilder.ToString(), Sort_By_Score = Sort_By_Score, Page_Number = ResultsPage }; // Pass all the results into the List and add the highlighted text to each result as well foreach (Solr_Page_Result thisResult in results) { // Add the highlight snipper if ((results.Highlights.ContainsKey(thisResult.PageID)) && (results.Highlights[thisResult.PageID].Count > 0) && (results.Highlights[thisResult.PageID].ElementAt(0).Value.Count > 0)) { thisResult.Snippet = results.Highlights[thisResult.PageID].ElementAt(0).Value.ElementAt(0); } // Add this results searchResults.Add_Result( thisResult ); } return searchResults; }
/// <summary> This provides an opportunity for the viewer to perform any pre-display work /// which is necessary before entering any of the rendering portions </summary> /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering </param> /// <remarks> This method his class pulls any full-text search results for this single item from the Solr/Lucene engine </remarks> public override void Perform_PreDisplay_Work(Custom_Tracer Tracer) { if (!String.IsNullOrWhiteSpace(CurrentMode.Text_Search)) { List<string> terms = new List<string>(); List<string> web_fields = new List<string>(); // Split the terms correctly SobekCM_Assistant.Split_Clean_Search_Terms_Fields(CurrentMode.Text_Search, "ZZ", Search_Type_Enum.Basic, terms, web_fields, null, Search_Precision_Type_Enum.Contains, '|'); Tracer.Add_Trace("Text_Search_Item_Viewer.Perform_PreDisplay_Work", "Performing Solr/Lucene search"); int page = CurrentMode.SubPage.HasValue ? Math.Max(CurrentMode.SubPage.Value, ((ushort)1)) : 1; results = Solr_Page_Results.Search(CurrentItem.BibID, CurrentItem.VID, terms, 20, page, false); Tracer.Add_Trace("Text_Search_Item_Viewer.Perform_PreDisplay_Work", "Completed Solr/Lucene search in " + results.QueryTime + "ms"); } }
/// <summary> Perform an in-document search for pages with matching full-text </summary> /// <param name="BibID"> Bibliographic identifier (BibID) for the item to search </param> /// <param name="VID"> Volume identifier for the item to search </param> /// <param name="Search_Terms"> Terms to search for within the page text </param> /// <param name="ResultsPerPage"> Number of results to display per a "page" of results </param> /// <param name="ResultsPage"> Which page of results to return ( one-based, so the first page is page number of one )</param> /// <param name="Sort_By_Score"> Flag indicates whether to sort the results by relevancy score, rather than the default page order </param> /// <returns> Page search result object with all relevant result information </returns> public static Solr_Page_Results Search(string BibID, string VID, List <string> Search_Terms, int ResultsPerPage, int ResultsPage, bool Sort_By_Score) { // Ensure page is not erroneously set to zero or negative if (ResultsPage <= 0) { ResultsPage = 1; } // Create the solr worker to query the page index var solrWorker = Solr_Operations_Cache <Solr_Page_Result> .GetSolrOperations(Engine_ApplicationCache_Gateway.Settings.Servers.Page_Solr_Index_URL); // Create the query options QueryOptions options = new QueryOptions { Rows = ResultsPerPage, Start = (ResultsPage - 1) * ResultsPerPage, Fields = new [] { "pageid", "pagename", "pageorder", "score", "thumbnail" }, Highlight = new HighlightingParameters { Fields = new[] { "pagetext" }, }, ExtraParams = new Dictionary <string, string> { { "hl.useFastVectorHighlighter", "true" } } }; // If this is not the default Solr sort (by score) request sort by the page order if (!Sort_By_Score) { options.OrderBy = new[] { new SortOrder("pageorder", Order.ASC) } } ; // Build the query string StringBuilder queryStringBuilder = new StringBuilder("(bibid:" + BibID + ")AND(vid:" + VID + ")AND("); bool first_value = true; foreach (string searchTerm in Search_Terms) { if (searchTerm.Length > 1) { // Skip any AND NOT for now if (searchTerm[0] != '-') { // Find the joiner if (first_value) { if (searchTerm.IndexOf(" ") > 0) { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Substring(1).Replace(":", "") + "\")"); } else { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Replace(":", "") + "\")"); } } else { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append("(pagetext:" + searchTerm.Substring(1).Replace(":", "") + ")"); } else { queryStringBuilder.Append("(pagetext:" + searchTerm.Replace(":", "") + ")"); } } first_value = false; } else { if ((searchTerm[0] == '+') || (searchTerm[0] == '=') || (searchTerm[0] == '-')) { queryStringBuilder.Append(searchTerm[0] == '=' ? " OR " : " AND "); if (searchTerm.IndexOf(" ") > 0) { queryStringBuilder.Append("(pagetext:\"" + searchTerm.Substring(1).Replace(":", "") + "\")"); } else { queryStringBuilder.Append("(pagetext:" + searchTerm.Substring(1).Replace(":", "") + ")"); } } else { if (searchTerm.IndexOf(" ") > 0) { queryStringBuilder.Append(" AND (pagetext:\"" + searchTerm.Replace(":", "") + "\")"); } else { queryStringBuilder.Append(" AND (pagetext:" + searchTerm.Replace(":", "") + ")"); } } } } } } queryStringBuilder.Append(")"); // Perform this search SolrQueryResults <Solr_Page_Result> results = solrWorker.Query(queryStringBuilder.ToString(), options); // Create the results object to pass back out var searchResults = new Solr_Page_Results { QueryTime = results.Header.QTime, TotalResults = results.NumFound, Query = queryStringBuilder.ToString(), Sort_By_Score = Sort_By_Score, Page_Number = ResultsPage }; // Pass all the results into the List and add the highlighted text to each result as well foreach (Solr_Page_Result thisResult in results) { // Add the highlight snipper if ((results.Highlights.ContainsKey(thisResult.PageID)) && (results.Highlights[thisResult.PageID].Count > 0) && (results.Highlights[thisResult.PageID].ElementAt(0).Value.Count > 0)) { thisResult.Snippet = results.Highlights[thisResult.PageID].ElementAt(0).Value.ElementAt(0); } // Add this results searchResults.Add_Result(thisResult); } return(searchResults); } }