Solr學習總結(六)SolrNet的高級用法(復雜查詢,分頁,高亮,Facet查詢)


        上一篇,講到了SolrNet的基本用法及CURD,這個算是SolrNet 的入門知識介紹吧,昨天寫完之后,有朋友評論說,這些感覺都被寫爛了。沒錯,這些基本的用法,在網上百度,資料肯定一大堆,有一些寫的肯定比我的好,不過,這個是Solr系列文章,會從Solr的基礎入門講到實際開發中的分頁,高亮,Facet查詢等高級用法。所以,基礎的入門也會涉及一些,望大家見諒。我用這么多篇文章,來總結Solr 也是為了將Solr 的 安裝,配置,開發等等,整個過程的資料,都能總結匯集到一起,這樣不管是懂Solr還是不知道Solr 的人,都能按照我的文章,一步一步的學習入門。

 

        下面就來講一講SolrNet的高級用法(復雜查詢,分頁,高亮,Facet查詢)。其實這些高級查詢,說白了,也還是SolrNet 將Solr 的相關查詢參數封裝起來了,使得我們調用更加方便。但是實際上還是按照Solr 的參數規則,拼接查詢參數,並向Solr 服務器發起請求。這就是所謂的萬變不離其宗,這也是我前面花兩篇文章,來總結Solr 的查詢參數的初心。如果有興趣可以監控SolrNet 發起的Http 請求,看看是不是按照solr 的查詢參數規則來的。具體Solr的查詢參數相關說明,請看這篇文章《Solr學習總結(四)Solr查詢參數》

 

   示例下載:Demo下載

 

   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)等。

                 b. ISolrQuery 查詢條件,集合

                 c. SolrMultipleCriteriaQuery條件集合之間的關系,(AND,OR)

           

   2.分頁

      分頁其實也就是比查詢,多設置了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.高亮  

            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查詢。這個由於本人實際中沒有用到過。所以就不在這里多講了。感興趣的朋友,可以去研究研究,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM