隐藏

solr与.net系列课程(五)solrnet的使用

发布:2022/10/21 15:26:07作者:管理员 来源:本站 浏览次数:953

最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下solr的.net客户端solrnet


    出处  https://github.com/mausch/SolrNet


   上一篇文章讲述了C#是如何请求和接受solr的数据的,请求链接是自己拼接的,接受数据是使用数据契约,solrnet就是把这些步骤封装起来,大家直接调用方法就可以请求和接受数据


    首先要下载solrnet所要使用的DLL


    Microsoft.Practices.ServiceLocation.dll


    SolrNet.dll


    HttpWebAdapters.dll


    下载地址 http://pan.baidu.com/s/1pJt7Wr5


    创建一个项目,然后引用上面的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

1


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