最近在做一個日志系統,用普通關系型數據庫做數據查詢遇到了查詢的瓶頸,想到了用成熟的搜索應用服務,我所知道的比較成熟的搜索應用服務有solr和es(elasticsearch),由於時間比較倉促,最後選擇了比較熟悉的solr。
Solr是一個高性能,采用Java5開發,Solr基於Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展並對查詢性能進行了優化,並且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎,他是基於Lucene的封裝比較成熟的全文搜索服務器。solr怎樣部署在windows服務器上的,推薦一枚信峰的博客http://www.cnblogs.com/wenxinghaha/tag/.net%20%20solr/,他這裡寫的比較詳細。solr的5.0目前不支持IK分詞,所以只好使用4.10版本,solr 的部署也比較方便,再部署的時間可以通過配置文件將數據庫的數據索引到solr服務器內,並且能根據索引時間定時的同步數據到solr服務器。
我們在做查詢的時間是使用過的C#語言,所以要用到solr在.NET中的驅動,目前比較流行的有solr.NET和easynet.solr,solr.NET是一個比較穩定的開源的solr驅動,easynet.solr是國內一同行在solr.NET上面做了封裝,我采用的是最原生的solr.net,驅動下載地址https://github.com/mausch/SolrNet。由於solr服務器是提供restful接口的操作的,所以solrnet對於solr服務的請求其實還是基於http請求的
solrnet的應用我就做過多的說明了,在這裡我主要是想說一下solrnet的分組查詢
附代碼
public class SolrNetOperate { static SolrNetOperate() { Startup.Init<LogItems>("http://000.000.000.000:8080/solr/logs"); } /// <summary> /// </summary> /// <param name="dictPars">查詢參數字典</param> /// <param name="start">分頁開始標識</param> /// <param name="rows">每頁數量</param> /// <param name="startTime">開始時間</param> /// <param name="endTime">結束時間</param> /// <param name="count">輸出參數 總個數</param> /// <returns></returns> /// <remarks>oldman 2015年7月23日14:11:43</remarks> public static List<int> GroupingSerach(Dictionary<string, string> dictPars, int start, int rows, DateTime startTime, DateTime endTime, out int count) { //定義solr var solr = ServiceLocator.Current.GetInstance<ISolrOperations<LogItems>>(); var queryOptions = new QueryOptions(); //定義分組 var groupingParameters = new GroupingParameters(); groupingParameters.Fields = new Collection<string> { "logs_id" }; groupingParameters.Ngroups = true; //設置查詢分組的總個數為true //定義過濾條件 var timeRange = new SolrQueryByRange<DateTime>("logs_time", startTime, endTime); queryOptions.AddFilterQueries(timeRange); foreach (string key in dictPars.Keys) { queryOptions.AddFilterQueries(new SolrQueryByField(key, dictPars[key])); } //定義排序 queryOptions.OrderBy = new Collection<SortOrder> { new SortOrder("logs_id", Order.DESC) }; queryOptions.Grouping = groupingParameters; queryOptions.Start = start; queryOptions.Rows = rows; SolrQueryResults<LogItems> res = solr.Query(SolrQuery.All, queryOptions); GroupedResults<LogItems> items = res.Grouping["logs_id"]; count = items.Ngroups ?? 0; return items.Groups.Select(item => Convert.ToInt32(item.GroupValue)).ToList(); } }
這裡是分組後做查詢,排序和分頁,代碼很清晰,有問題可以和我交流
附帶源碼:https://github.com/lipeng1991/SolrDemo
本人的.NET學習技術交流群:226704167
努力學習,只為一個夢想。