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

最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下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 = ;
protected void Page_Load(object sender, EventArgs e)
{ Search("上海", "北京,上海", "电力", "项目", , ""); } 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 == "")//所有数据
{
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 + ; //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 == "")//所有数据
{
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

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

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

    solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据 上一节我们完成了solr连接数据库,细心的朋友会发现一个问题,就是solr其实和语言没有任何关系,配置完成后任何语 ...

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

    solr与.net系列课程(九)solr5.1的配置 最近一些园友来咨询solr5.1的配置方式,然后我就去官网下载了个最新版本的solr,发现solr5.0以后solr的下载包里的内容发生的变化,移 ...

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

    solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来 ...

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

    solr与.net系列课程(七)solr主从复制    既然solr是解决大量数据全文索引的方案,由于高并发的问题,我们就要考虑solr的负载均衡了,solr提供非常简单的主从复制的配置方法,那么下面 ...

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

     solr与.net系列课程(六)solr定时增量索引与安全 solr增量索引的方式,就是一个Http请求,但是这样的请求显然不能满足要求,我们需要的是一个自动的增量索引,solr官方提供了一个定时器 ...

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

     solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些 ...

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

    solr与.net系列课程(二)solr的配置文件及其含义  本节内容还是不会涉及到.net与数据库的内容,但是不要着急,这都是学时solr必学要掌握的东西,solr可不是像其他的dll文件一样,只需 ...

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

    不久之前开发了一个项目,需要用到solr,因为所以在开始再网上查找资料,但是发现大部分的资料都是很片面的,要么就是只讲解solr如何安装的,要么就是只讲解solr的某一个部分的,而且很多都是资料都是一 ...

  9. Silverlight for Windows Phone开发系列课程

    Silverlight for Windows Phone开发系列课程(1):Windows Phone平台概况         课程简介:本节开始介绍系列课程的概况,包括课程内容,先决条件,学习目的 ...

随机推荐

  1. jQuery Mobile 脚本加载问题

    刚开始使用jQuery Mobile,发现很多问题需要重新考虑,比如脚本加载问题. 在普通html中,如果a.html中有链接到b.html,b.html中有类似代码: $(document).rea ...

  2. An attempt was made to load a program with an incorrect format

      用.net调用一个C++ 32位的DLL, 编译的时候选择x86, 在部署到一个64位的机器上的时候报错:"An attempt was made to load a program w ...

  3. <COM原理和应用>第七章的ITextObject代码是什么?

      第7章中有如下的描述:-----------------------------------为了在程序中使用"Text.Object"文本对象,我们利用ClassWizard引 ...

  4. 数据库dump导入

    数据库dump导入 一.导入命令介绍: Oracle dump数据导入导出有两种方式:imp/exp.impdp/expdp.两者区别: 1.exp/imp客户端程序,受网络,磁盘的影响:impdp/ ...

  5. 项目支持Servlet3.0的新特性

    一.Servlet3.0介绍 Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述 ...

  6. centos7.2下编译安装git

    centos最新的7.2版本,git居然是1.8,而最新的git版本是2.9 差的太多了,何况git2.0后有大更新.于是,我决定编译安装.中间有一点小破折,记录一下,备忘. 1,下载最新的源码,网址 ...

  7. 四则运算(Android)版

    实验题目: 将小学四则运算整合成网页版或者是Android版.实现有无余数,减法有无负数.... 设计思路: 由于学到的基础知识不足,只能设计简单的加减乘除,界面设计简单,代码量少,只是达到了入门级的 ...

  8. Spring 通过工厂配置Bean

    1.通过静态工厂方法配置Bean 要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名 ...

  9. HDU 4819 Mosaic (二维线段树)

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  10. spring结合Quartz的集群功能实现

    一:前沿 在上一篇(http://www.cnblogs.com/wuhao1991/p/4331613.html)的博客中记载了定时的功能,但是集成是没有成功的,在这篇中,我在解释下这里的”集成的含 ...