solr與.net系列課程(五)solrnet的使用html
最近因項目比較忙,因此這篇文章出的比較晚,離上一篇文章已經有半個月的時間了,這節課咱們來學下一下solr的.net客戶端solrnetgit
出處 https://github.com/mausch/SolrNetgithub
上一篇文章講述了C#是如何請求和接受solr的數據的,請求連接是本身拼接的,接受數據是使用數據契約,solrnet就是把這些步驟封裝起來,你們直接調用方法就能夠請求和接受數據安全
首先要下載solrnet所要使用的DLL服務器
Microsoft.Practices.ServiceLocation.dllthis
SolrNet.dllurl
HttpWebAdapters.dllspa
下載地址 http://pan.baidu.com/s/1pJt7Wr5.net
建立一個項目,而後引用上面的DLL設計
好了,下面就開始實戰, 咱們來設計一個查詢條件 title="關鍵字" and (area="北京" or area="上海") and industry="電力" and columns="項目" order time desc
(1)建立一個接收數據的實體類,內容以下
using System; using System.Collections.Generic; using System.Linq; using System.Web; using SolrNet.Attributes; namespace WebApplication5 { public class Article { [SolrUniqueKey("id")] public int id { get; set; } [SolrField("title")] public string title { get; set; } [SolrField("area")] public string area { get; set; } [SolrField("industry")] public string industry { get; set; } [SolrField("body")] public string body { get; set; } [SolrField("adddate")] public DateTime adddate { get; set; } [SolrField("columns")] public string columns { get; set; } [SolrField("sorts")] public string sorts { get; set; } [SolrField("url")] public string url { get; set; } [SolrField("orderColumn")] public string orderColumn { get; set; } } }
SolrUniqueKey對應solr的惟一鍵,SolrField對應接收的字段
(2) 建立Global.asax加入以下代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; using SolrNet; namespace WebApplication5 { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { Startup.Init<Article>("http://192.168.0.14:8080/solr/collection1"); } protected void Session_Start(object sender, EventArgs e) { } protected void Application_BeginRequest(object sender, EventArgs e) { } protected void Application_AuthenticateRequest(object sender, EventArgs e) { } protected void Application_Error(object sender, EventArgs e) { } protected void Session_End(object sender, EventArgs e) { } protected void Application_End(object sender, EventArgs e) { } } }
引用using SolrNet;
Startup.Init<Article>("http://192.168.0.14:8080/solr/collection1"); 請求solr服務器的地址
(3)咱們開始使用solrnet,建立一個aspx頁面,先看代碼在而後再解釋每一個方法的含義
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using SolrNet; using SolrNet.Commands.Parameters; using System.Text; using System.Data; using System.Text.RegularExpressions; using Microsoft.Practices.ServiceLocation; namespace WebApplication5 { public partial class _Default : System.Web.UI.Page { public DataTable Result = new DataTable(); public int total; public int maxNum; public int pageNum = 36; protected void Page_Load(object sender, EventArgs e) { Search("上海", "北京,上海", "電力", "項目", 1, "0"); } public void Search(string keyword, string area, string industry, string columns, int start, string time) { //定義solr ISolrOperations<Article> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Article>>(); //創建排序,條件. QueryOptions options = new QueryOptions(); options.Rows = pageNum;//數據條數 options.Start = start;//開始項 //建立查詢條件 var qTB = new SolrQueryByField("title", keyword); //建立條件集合 List<ISolrQuery> query = new List<ISolrQuery>(); //添加條件 query.Add(qTB); //查詢地區,多個地區,這裏用 ,號隔開,例 北京,上海,杭州 if (area != "") { //建立集合存存儲地區 List<ISolrQuery> ar = new List<ISolrQuery>(); string[] ares = area.Split(new char[] { ',' }); foreach (string a in ares) { //存儲地區 ar.Add(new SolrQueryByField("area", a)); } //建立地區之間的關係,是OR仍是AND var qArea = new SolrMultipleCriteriaQuery(ar, "OR"); //添加至條件集合 query.Add(qArea); } //行業條件,與地區同樣 if (industry != "") { List<ISolrQuery> ind = new List<ISolrQuery>(); string[] industs = industry.Split(new char[] { ',' }); foreach (string a in industs) { ind.Add(new SolrQueryByField("industry", a)); } var qIndustry = new SolrMultipleCriteriaQuery(ind, "OR"); query.Add(qIndustry); } //欄目條件同上 if (columns != "") { List<ISolrQuery> colm = new List<ISolrQuery>(); string[] cols = columns.Split(new char[] { ',' }); foreach (string a in cols) { colm.Add(new SolrQueryByField("columns", a)); } var qColumns = new SolrMultipleCriteriaQuery(colm, "OR"); query.Add(qColumns); } //建立時間範圍實例 SolrQueryByRange<DateTime> qDateRange = null; //七天內數據 if (time == "-7") { //後兩個參數,一個是開始時間,一個是結束時時間 qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.Now.AddDays(int.Parse(time)), DateTime.MaxValue); } else if (time == "0")//全部數據 { qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.MinValue, DateTime.MaxValue); } else//其餘 { qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.Today.AddMonths(int.Parse(time)), DateTime.MaxValue); } //加入集合 query.Add(qDateRange); //按照時間倒排序. options.AddOrder(new SolrNet.SortOrder("adddate", Order.DESC)); //條件集合之間的關係 var qTBO = new SolrMultipleCriteriaQuery(query, "AND"); //執行查詢,有5個重載 SolrQueryResults<Article> results = solr.Query(qTBO, options); this.total = results.NumFound; maxNum = total / pageNum + 1; //Response.Write(t.Count); Result.Columns.Add("id", typeof(string)); Result.Columns.Add("title", typeof(string)); Result.Columns.Add("columns", typeof(string)); Result.Columns.Add("orderColumn", typeof(string)); Result.Columns.Add("area", typeof(string)); Result.Columns.Add("industry", typeof(string)); //Result.Columns.Add("body", typeof(string)); Result.Columns.Add("addDate", typeof(string)); Result.Columns.Add("url", typeof(string)); foreach (Article article in results) { string id = article.id.ToString(); string title = article.title; string orderColumn = article.orderColumn; string url = ""; DataRow row = this.Result.NewRow(); row["id"] = id; row["title"] = title; row["orderColumn"] = article.orderColumn; row["area"] = article.area; row["industry"] = article.industry; //row["body"] = OptimizeHighlight(body, keyword); row["addDate"] = article.adddate.ToShortDateString(); row["url"] = url; this.Result.Rows.Add(row); } } } }
咱們來一段段分析上面的代碼
建立solr實例,最終使用這個去執行命令
ISolrOperations<Article> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Article>>();
定義參數,排序,高亮,開始項,每頁個數
QueryOptions options = new QueryOptions(); options.Rows = pageNum;//數據條數 options.Start = start;//開始項
接下來建立查詢條件,首先建立添集合
List<ISolrQuery> query = new List<ISolrQuery>();
開始建立條件,並添加至集合,這是一個簡單的條件
//建立查詢條件 var qTB = new SolrQueryByField("title", keyword); //添加條件 query.Add(qTB);
下面添加一個稍微複雜的的條件,好比選擇 地區在 北京 OR 上海
//查詢地區,多個地區,這裏用 ,號隔開,例 北京,上海,杭州 if (area != "") { //建立集合存存儲地區 List<ISolrQuery> ar = new List<ISolrQuery>(); string[] ares = area.Split(new char[] { ',' }); foreach (string a in ares) { //存儲地區 ar.Add(new SolrQueryByField("area", a)); } //建立地區之間的關係,是OR仍是AND var qArea = new SolrMultipleCriteriaQuery(ar, "OR"); //添加至條件集合 query.Add(qArea); } //行業條件,與地區同樣 if (industry != "") { List<ISolrQuery> ind = new List<ISolrQuery>(); string[] industs = industry.Split(new char[] { ',' }); foreach (string a in industs) { ind.Add(new SolrQueryByField("industry", a)); } var qIndustry = new SolrMultipleCriteriaQuery(ind, "OR"); query.Add(qIndustry); } //欄目條件同上 if (columns != "") { List<ISolrQuery> colm = new List<ISolrQuery>(); string[] cols = columns.Split(new char[] { ',' }); foreach (string a in cols) { colm.Add(new SolrQueryByField("columns", a)); } var qColumns = new SolrMultipleCriteriaQuery(colm, "OR"); query.Add(qColumns); }
添加時間範圍,並加入條件集合
//建立時間範圍實例 SolrQueryByRange<DateTime> qDateRange = null; //七天內數據 if (time == "-7") { //後兩個參數,一個是開始時間,一個是結束時時間 qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.Now.AddDays(int.Parse(time)), DateTime.MaxValue); } else if (time == "0")//全部數據 { qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.MinValue, DateTime.MaxValue); } else//其餘 { qDateRange = new SolrQueryByRange<DateTime>("adddate", DateTime.Today.AddMonths(int.Parse(time)), DateTime.MaxValue); } //加入集合 query.Add(qDateRange);
肯定集合中已有的條件之間的關係,是AND仍是OR
var qTBO = new SolrMultipleCriteriaQuery(query, "AND");
執行查詢,獲取結果
//執行查詢,有5個重載 SolrQueryResults<Article> results = solr.Query(qTBO, options);
接下來咱們來運行一下,看看有沒有接受導數據
運行程序後,獲得36條數據,說明solrnet運行成功.這裏只是講解了一些基本的查詢方法,要想了解所有的方法,能夠去官網上去查看
地址:https://github.com/mausch/SolrNet/blob/master/Documentation/Querying.md
solrnet也能夠向solr中插入數據,這個很簡單,直接調用add(實體)方法就能夠了
例: solr.add(Article);
這節內容就到這裏了,下節咱們講述solr的定時增量索引和solr的安全性問題
在這裏推薦另外一個solr的.net 客戶端 EastNet.Solr
http://www.cnblogs.com/TerryLiang/archive/2011/05/03/2034847.html
qq羣: 424259523