/// <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 (CurrentMode.Text_Search.Length > 0) { 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"); results = Solr_Page_Results.Search(CurrentItem.BibID, CurrentItem.VID, terms, 20, CurrentMode.SubPage, 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( SobekCM_Library_Settings.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 ISolrQueryResults<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> Stores the item-level search results string </summary> /// <param name="BibID"> Bibliographic Identifier for the digital resource against which the search was conducted </param> /// <param name="VID"> Volume Identifier for the digital resourceagainst which the search was conducted </param> /// <param name="StoreObject"> Item-level search results strings </param> /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param> public static void Store_Item_Search_Results(string BibID, string VID, Solr_Page_Results StoreObject, Custom_Tracer Tracer) { // If the cache is disabled, just return before even tracing if (Disabled) return; // Determine the key string key = "ITEMSEARCH_" + BibID + "_" + VID + "_" + StoreObject.Query.ToLower() + "_" + StoreObject.Page_Number; if (StoreObject.Sort_By_Score) key = key + "_SCORE"; if (Tracer != null) { Tracer.Add_Trace("Cached_Data_Manager.Store_Item_Search_Results", "Adding object '" + key + "' to the cache with expiration of 5 minutes"); } // Store this on the cache if (HttpContext.Current.Cache[key] == null) { HttpContext.Current.Cache.Insert(key, StoreObject, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5)); } }
/// <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(SobekCM_Library_Settings.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 ISolrQueryResults <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); } }