solr與.net系列課程(五)solrnet的使用

 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

相關文章
相關標籤/搜索