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

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

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

在这里推荐另一个solr的.net 客户端 EastNet.Solr

http://www.cnblogs.com/TerryLiang/archive/2011/05/03/2034847.html

虽然说我的项目是用solrnet做的,但是不太推荐大家使用,因为solrnet的文档非常的少,出了问题非常不容易解决,而且在solr4.0以后会有一些问题,所以建议大家使用EasyNet.solr,而且网上的例子比较多

 
 
标签: .net solr

solrnet的使用的更多相关文章

  1. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  2. 通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD

    前言 老规矩,任何技术的入门我通常都会总结增删改查,本文我就通过HttpWebRequest和SolrNet的方式实现Solr最基础的增删改查(CURD).对于自己的完整项目,同时不想过于依赖第三方类 ...

  3. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

    上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...

  4. Solr学习总结(五)SolrNet的基本用法及CURD

    上一篇已经讲到了Solr 查询的相关的参数.这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多,一直都在更新, ...

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

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

  6. Solr分页与高亮(使用SolrNet实现)

    Solr分页与高亮(使用SolrNet实现) 本节我们使用Asp.net MVC实现Solr客户端查询,建议使用SolrNet这个客户端,开源地址在:https://github.com/mausch ...

  7. solrnet - document

      Overview and basic usage Mapping Initialization Create/Update/Delete Querying Faceting Highlightin ...

  8. 使用SolrNet访问Solr-5.5.0

    由于今年年初刚发布的Solr-5.5.0,网上所能找到的资料少之又少,所以只能靠自己一点点摸索. 从某Hub上下载了SolrNet源码,按照教程提交文档或者查询均失败,无奈只得跟断点一点点差怎么回事. ...

  9. solr .Net端(SolrNet)

    首先 引用SolrNet.dll Microsoft.Practices.ServiceLocation HttpWebAdapters 也可以用.net IDe 中的 nuget下载 solrnet ...

随机推荐

  1. synchronized和进程间通信(转)

    关于JAVA多线程同步 JAVA多线程同步主要依赖于若干方法和关键字 1  wait方法: 该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行, ...

  2. PHP 闭包函数 function use 使用方法实例

    /** * @param string $hisStart * @param string $hisEnd * @param int $range * @param string $format * ...

  3. poj 2482 Stars in Your Window(扫描线)

    id=2482" target="_blank" style="">题目链接:poj 2482 Stars in Your Window 题目大 ...

  4. .NET反编译之Reflector基础示例

    这几日由于公司需要, 看了些.NET反编译技巧,特地和大家分享下 .NET反编译工具很多,Reflector是其中一个很优秀的工具,所以就用它来进行反编译工作了.今天我们就用"繁星代码生成器 ...

  5. WIN8 、WIN7 下IIS7.5、IIS8 的rewrite 伪静态功能设置方法

    原文 WIN8 .WIN7 下IIS7.5.IIS8 的rewrite 伪静态功能设置方法 win7和win8系统都自带有iis的功能.关于IIS的安装,上一篇已经讲述,这里就不重复了. 下面说下在w ...

  6. Storing and Retrieving Images from SQL Server using Microsoft .NET

    原文 Storing and Retrieving Images from SQL Server using Microsoft .NET Download source - 19.6 Kb Intr ...

  7. Linux对于录音

    一.原理简介 在Linux下,记录--从dsp读取数据.播放--至dsp设备写入数据. 开发板採用声卡UDA1341实现音频编解码,完毕A/D和D/A转换,芯片UDA1341与CPU的连接图例如以下: ...

  8. hdu 4115 石头剪子布(2-sat问题)

    /* 意甲冠军:石头剪子布,目前已知n周围bob会有什么,对alice限制.供u,v,w:设w=0说明a,b回合必须出的一样 否则,必须不一样.alice假设输一回合就输了,否则就赢了 解: 2-sa ...

  9. EJBCA于Linux安装在

    于windows为了测试安装,装在linuxserver因为CN使用ip需要重新加载.....再折腾.这里有一些地方需要注意 一.所需文件 内容准备不说,请参阅我在以前的文章<EJBCA于win ...

  10. C#后台利用正则表达式查找匹配字符

    /// <summary>        /// 发送短信 系统固化短信        /// </summary>        /// <param name=&qu ...