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

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

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

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

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

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

Microsoft.Practices.ServiceLocation.dll

SolrNet.dll

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

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

这节内容就到这里了,下节我们讲述solr的定时增量索引和solr的安全性问题

时间: 2024-10-01 07:02:05

solr与.net系列课程(五)solrnet的使用的相关文章

solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据

solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据 上一节我们完成了solr连接数据库,细心的朋友会发现一个问题,就是solr其实和语言没有任何关系,配置完成后任何语言都可以直接调用,本章我们主要对solr的查询做出讲解,然后就是新接触的人最关心的.net如何获取solr中的数据. 本节我准备了一个300万左右的数据表,为大家做演示 然后我们开始配置schema.xml 文件: <field name="id" type="string

solr与.net系列课程(九)solr5.1的配置

solr与.net系列课程(九)solr5.1的配置 最近一些园友来咨询solr5.1的配置方式,然后我就去官网下载了个最新版本的solr,发现solr5.0以后solr的下载包里的内容发生的变化,移除和添加了一些文件,这就导致solr的初始配置不一样了,导致一些园友学习solr时不得不下载以前的solr版本进行学习,为了与时俱进不被淘汰,所以的就在这里加一篇solr5.1的配置方式,希望大家少走一些弯路. 1.下载Tomcat与solr并解压(安装前先装jdk) Tomcat解压后磁盘路径为C

solr与.net系列课程(七)solr主从复制

solr与.net系列课程(七)solr主从复制    既然solr是解决大量数据全文索引的方案,由于高并发的问题,我们就要考虑solr的负载均衡了,solr提供非常简单的主从复制的配置方法,那么下面我们就来配置一下solr的主从复制 假设我们在192.168.0.8与192.168.0.9两台服务器上部署了solr服务,192.168.0.8作为主服务器,192.168.0.9作为从服务器, 首先配置主服务器找到C:\Program Files\Apache Software Foundati

solr与.net系列课程(二)solr的配置文件及其含义

 solr与.net系列课程(二)solr的配置文件及其含义  本节内容还是不会涉及到.net与数据库的内容,但是不要着急,这都是学时solr必学要掌握的东西,solr可不是像其他的dll文件一样,只需要引用就能调出方法与数据的,你不配置好是无法使用,前两节主要是起铺垫作用的,看起来会很枯燥无味的. 本章节内容是为下一节连接数据库做准备的,单拿出来看的话,会让人很迷糊,没关系,就当提前预习了,知道有这么个东西就行了,等下一节结合数据库后就好理解了 上一节我们已经完成了solr的基本配置,这里我们

solr与.net系列课程(八)solr中重跑索引的注意事项

solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来说一说新建索引的一下注意事项 终止跑索引                  http://192.168.0.9:8080/solr/collection1/dataimport?command=abort 开始索引                     http://192.168.0.9:80

solr与.net系列课程(六)solr定时增量索引与安全

 solr与.net系列课程(六)solr定时增量索引与安全 solr增量索引的方式,就是一个Http请求,但是这样的请求显然不能满足要求,我们需要的是一个自动的增量索引,solr官方提供了一个定时器实例,来完成增量索引, 首先下载 apache-solr-dataimportscheduler-1.0.jar,下载地址:http://solr-dataimport-scheduler.googlecode.com/files/apache-solr-dataimportscheduler-1.

solr与.net系列课程(三)solr连接数据库

 solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些文件 1.先下载连接sqlserver的驱动(sqljdbc4.jar)sqljdbc4.jar,),将其复制到C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\solr\WEB-INF\lib (C:\Program Fi

solr与.net系列课程(一)solr的安装与配置

不久之前开发了一个项目,需要用到solr,因为所以在开始再网上查找资料,但是发现大部分的资料都是很片面的,要么就是只讲解solr如何安装的,要么就是只讲解solr的某一个部分的,而且很多都是资料都是一模一样的,一个人转载另一个人的,很难找到一个从solr配置,到与数据库连接在结合实际项目的,而且由于solr使用java开发的,所以现实中大多数的实例都是java版本的,.net版本的少之又少,所以一个.net开发人员在没有别人讲解的情况下学习solr是一件很吃力的事情,所以我想写出一个solr的系

&lt;从编程到(架构)设计之路&gt;的翻转式系列课程

<从编程到(架构)设计之路>的翻转式系列课程 课程(1):  从接口(Interface)出发:接口设计的技术和艺术 一個成功案例的實務傳承 高焕堂37年码农经验讲解 指导教练:高焕堂 1. 简介翻转式课堂 1.1  翻转式课堂的目标 萨尔曼·可汗 說:未来的世界是不确定的,因此重要的不是学到什么,而是学习新知识的能力.教育应该具有实践性,其目的应该是帮助学生掌握技能.取得信息,使他们能够谋生.教育应该具有实践性,其目的应该是帮助学生掌握技能.取得信息,使他们能够谋生.学徒制的基础是主动学习-