上一篇,講到了SolrNet的基本用法及CURD,這個算是SolrNet 的入門知識介紹吧,昨天寫完以後,有朋友評論說,這些感受都被寫爛了。沒錯,這些基本的用法,在網上百度,資料確定一大堆,有一些寫的確定比個人好,不過,這個是Solr系列文章,會從Solr的基礎入門講到實際開發中的分頁,高亮,Facet查詢等高級用法。因此,基礎的入門也會涉及一些,望你們見諒。我用這麼多篇文章,來總結Solr 也是爲了將Solr 的 安裝,配置,開發等等,整個過程的資料,都能總結聚集到一塊兒,這樣無論是懂Solr仍是不知道Solr 的人,都能按照個人文章,一步一步的學習入門。html
下面就來說一講SolrNet的高級用法(複雜查詢,分頁,高亮,Facet查詢)。其實這些高級查詢,說白了,也仍是SolrNet 將Solr 的相關查詢參數封裝起來了,使得咱們調用更加方便。可是實際上仍是按照Solr 的參數規則,拼接查詢參數,並向Solr 服務器發起請求。這就是所謂的萬變不離其宗,這也是我前面花兩篇文章,來總結Solr 的查詢參數的初心。若是有興趣能夠監控SolrNet 發起的Http 請求,看看是否是按照solr 的查詢參數規則來的。具體Solr的查詢參數相關說明,請看這篇文章《Solr學習總結(四)Solr查詢參數》服務器
示例下載:Demo下載less
1.複雜查詢學習
public static void Query(string keyword, int category, string color, double price, int start, DateTime? startTime, DateTime? endTime, int pageNum) { //定義solr ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>(); QueryOptions options = new QueryOptions();//建立條件集合 List<ISolrQuery> query = new List<ISolrQuery>(); if (!string.IsNullOrEmpty(keyword)) { List<ISolrQuery> ar = new List<ISolrQuery>(); string[] keywords = keyword.Split(new char[] { ',' }); foreach (string a in keywords) { ar.Add(new SolrQueryByField("id", a)); } //建立ID 條件集合的關係,是OR仍是AND var kw = new SolrMultipleCriteriaQuery(ar, "OR"); //添加至條件集合 query.Add(kw); } if (category > 0) { // 建立分類的查詢條件 var qCate = new SolrQueryByField("category", category.ToString()); //添加條件 query.Add(qCate); } //查詢顏色,多個顏色,用 ,號隔開 green,grey if (color != "") { //建立顏色條件集合 List<ISolrQuery> ar = new List<ISolrQuery>(); string[] colors = color.Split(new char[] { ',' }); foreach (string a in colors) { ar.Add(new SolrQueryByField("color", a)); } //建立顏色查詢條件的關係,是OR仍是AND var qcolor = new SolrMultipleCriteriaQuery(ar, "OR"); //添加至條件集合 query.Add(qcolor); } //建立時間範圍條件, 開始時間和結束時間 SolrQueryByRange<DateTime> qDateRange = null; if (startTime != null && endTime != null) { var stime = DateTime.Parse(startTime.ToString()); var etime = DateTime.Parse(endTime.ToString()); //後兩個參數,一個是開始時間,一個是結束時時間 qDateRange = new SolrQueryByRange<DateTime>("updatetime", stime, etime); //時間範圍條件加入集合 query.Add(qDateRange); } //設定查詢結果的排序,按照時間倒排序. options.AddOrder(new SolrNet.SortOrder("updatetime", Order.DESC)); //條件集合之間的關係 var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); //執行查詢 SolrQueryResults<Product> results = solr.Query(qTBO, options); // 顯示查詢結果 foreach (Product p in results) { Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price); } Console.ReadKey(); }
說明:a. QueryOptions 查詢的相關設置,分頁屬性,結果集排序,條件集合之間的關係(AND, OR)等。spa
b. ISolrQuery 查詢條件,集合code
c. SolrMultipleCriteriaQuery條件集合之間的關係,(AND,OR)htm
2.分頁blog
分頁其實也就是比查詢,多設置了Rows和Start 參數。其餘的和查詢一致。最後返回的時候,除了返回查詢結果,還要返回總頁數和數據總條數排序
QueryOptions options = new QueryOptions(); //分頁參數 options.Rows = pageNum; //數據條數 options.Start = start; //開始項
// 拼接相關查詢條件 . .
. //執行查詢 SolrQueryResults<Product> results = solr.Query(qTBO, options); // 獲得返回的數據總條數和total和 總頁數 用於分頁顯示, var total = results.NumFound; var pageCount = total / pageNum + 1;
3.高亮 ip
QueryOptions options = new QueryOptions(); var high = new HighlightingParameters(); high.Fields = new List<string> { "color" }; high.BeforeTerm = "<font color='red'><b>"; high.AfterTerm = "</b></font>"; options.Highlight = high; // 拼接其餘查詢條件 . . . //執行查詢 SolrQueryResults<Product> results = solr.Query(qTBO, options); // 處理須要高亮的字段 var highlights = results.Highlights; foreach (var item in results) { var t = highlights[item.id.ToString()].Values.ToList()[0].ToList()[0]; item.color = t; } // 顯示查詢結果 foreach (Product p in results) { Console.WriteLine("id:{0} name:{1} color:{2} price:{3}", p.id, p.name, p.color, p.price); }
4.Facet查詢
Facet 本書還有不少參數來限制,選擇結果集。這裏只介紹了幾個基本的Facet用法。其餘的就不一一細說。你們本身去研究吧。
1. 普通分組,按照某個字段分組
var facet = new FacetParameters { Queries = new[] { new SolrFacetFieldQuery("category") } }; options.Facet = facet; var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options); foreach (var f in results.FacetFields["category"]) { Console.WriteLine("{0}: {1}", f.Key, f.Value); }
2. 時間段分組
SolrFacetDateQuery 類裏面的幾個參數比較複雜。具體的能夠去研究研究Date Facet 相關的參數說明。
// 時間分組 var facet = new FacetParameters { Queries = new[] { new SolrFacetDateQuery( "updatetime", new DateTime(2015, 11, 1) /* 開始時間 */, new DateTime(2015,12, 31) /* 結束時間 */, "+7DAY" /* 時間間隔 */) { HardEnd = true, Other = new[] {FacetDateOther.After, FacetDateOther.Before} }, } }; options.Facet = facet; //條件集合之間的關係 var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options); DateFacetingResult dateFacetResult = results.FacetDates["updatetime"]; foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults) { Console.WriteLine(dr.Key); Console.WriteLine(dr.Value); }
3. 任意分組
// 按照價格段分組 var lessThan30 = new SolrQueryByRange<decimal>("price", 0m, 30m); var lessThan70 = new SolrQueryByRange<decimal>("price", 30m, 70m); var moreThan70 = new SolrQueryByRange<decimal>("price", 70m, 100m); var facet = new FacetParameters { Queries = new[] { new SolrFacetQuery(lessThan30), new SolrFacetQuery(lessThan70), new SolrFacetQuery(moreThan70) } }; options.Facet = facet; var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); SolrQueryResults<Product> results = solr.Query(qTBO, options); foreach (var f in results.FacetQueries) { Console.WriteLine("{0}: {1}", f.Key, f.Value); }
4. Pivot faceting, Pivot 這個概念仍是蠻難解釋的,有點相似於BI 報表中的數據鑽取,即 一層一層的進行分組 統計,例如 先按顏色,分組統計,而後在統計的結果集某個子分組裏面,再按照 分類 進行分組統計。
/// <summary> /// Facet 查詢 /// </summary> /// <param name="color"></param> public static void Query_FactPivot() { ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>(); //Create a facet Pivot Query var facetPivotQuery = new SolrFacetPivotQuery() { //默認是 1 pivot, 先 category 再按 color 分組 //若是是多個,則在後面繼續追加 ,new PivotFields("color", "category") Fields = new[] { new PivotFields("color", "category")}, //最小記錄數 MinCount = 1 }; //建立一個查詢參數 //同時 pivotQueries 能夠和其餘查詢條件一塊兒混用 var facetParams = new FacetParameters() { Queries = new[] { facetPivotQuery }, Limit = 15 }; var queryOptions = new QueryOptions(); queryOptions.Facet = facetParams; queryOptions.Rows = 0; var results = solr.Query("*:*", queryOptions); if (results.FacetPivots.Count > 0) { foreach (var pivotTable in results.FacetPivots) { Console. WriteLine("Pivot table for " + pivotTable.Key); foreach (var pivot in pivotTable.Value) { Console.WriteLine(" Pivot: " + pivot.Field + " with value " + pivot.Value + ". Child Pivots:"); foreach (var pivotChild in pivot.ChildPivots) { Console.WriteLine(" - " + pivotChild.Value + " (" + pivotChild.Count + ")"); } } } } Console.ReadKey(); }
這個是比較精細化,也更加複雜的Facet查詢。這個因爲本人實際中沒有用到過。因此就不在這裏多講了。感興趣的朋友,能夠去研究研究,