/// <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; // Search differently, depending on the search type if (UI_ApplicationCache_Gateway.Settings.System.Search_System == Search_System_Enum.Beta) { results = v5_Solr_Searcher.Search_Within_Document(BriefItem.BibID, BriefItem.VID, terms, 20, page, false); } else { results = Legacy_Solr_Searcher.Search_Within_Document(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 Legacy_Solr_Page_Results Search_Within_Document(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; } // Get and clean the solr document url string solrPageUrl = Engine_ApplicationCache_Gateway.Settings.Servers.Page_Solr_Index_URL; if ((!String.IsNullOrEmpty(solrPageUrl)) && (solrPageUrl[solrPageUrl.Length - 1] == '/')) { solrPageUrl = solrPageUrl.Substring(0, solrPageUrl.Length - 1); } // Create the solr worker to query the page index var solrWorker = Solr_Operations_Cache <Legacy_Solr_Page_Result> .GetSolrOperations(solrPageUrl); // 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" }, Fragsize = 1000 }, ExtraParams = new Dictionary <string, string> { { "hl.useFastVectorHighlighter", "true" }, { "wt", "xml" } } }; // 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 <Legacy_Solr_Page_Result> results = solrWorker.Query(queryStringBuilder.ToString(), options); // Create the results object to pass back out var searchResults = new Legacy_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 (Legacy_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); } #endregion }