solrnet的使用
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,而且网上的例子比较多
solrnet的使用的更多相关文章
- SolrNet高级用法(分页、Facet查询、任意分组)
前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...
- 通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
前言 老规矩,任何技术的入门我通常都会总结增删改查,本文我就通过HttpWebRequest和SolrNet的方式实现Solr最基础的增删改查(CURD).对于自己的完整项目,同时不想过于依赖第三方类 ...
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...
- Solr学习总结(五)SolrNet的基本用法及CURD
上一篇已经讲到了Solr 查询的相关的参数.这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多,一直都在更新, ...
- solr与.net系列课程(五)solrnet的使用
solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下solr的.net客户端solrnet 出处 ...
- Solr分页与高亮(使用SolrNet实现)
Solr分页与高亮(使用SolrNet实现) 本节我们使用Asp.net MVC实现Solr客户端查询,建议使用SolrNet这个客户端,开源地址在:https://github.com/mausch ...
- solrnet - document
Overview and basic usage Mapping Initialization Create/Update/Delete Querying Faceting Highlightin ...
- 使用SolrNet访问Solr-5.5.0
由于今年年初刚发布的Solr-5.5.0,网上所能找到的资料少之又少,所以只能靠自己一点点摸索. 从某Hub上下载了SolrNet源码,按照教程提交文档或者查询均失败,无奈只得跟断点一点点差怎么回事. ...
- solr .Net端(SolrNet)
首先 引用SolrNet.dll Microsoft.Practices.ServiceLocation HttpWebAdapters 也可以用.net IDe 中的 nuget下载 solrnet ...
随机推荐
- transform:translateZ() 字体模糊问题 父类重返Z轴平面
translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...
- C++实现链表
最后几天留在Intel,没什么事情,都是开开会.趁着闲功夫,把数据结构复习一下,写了一个list.时间仓促,有些地方考虑的可能没那么到位,望高手们指点. #include <iostream&g ...
- mysql压力测试
1.采用 mysqlslap 压力测试 mysqlslap --defaults-file=/etc/my.cnf --concurrency=200 --iterations=1 --numbe ...
- mybatis generator插件开发
mybatis现在普遍使用的每一个人DAO框架.mybatis generator它可以基于数据库中的表结构,生成自己主动mybatis代码和配置文件,方便使用,当然,实际的使用过程中.generat ...
- IT薪酬
新加坡IT薪酬 2014-06-12 12:51 by 圣殿骑士, 8856 阅读, 37 评论, 收藏, 编辑 很多朋友发邮件或留言问我关于新加坡IT薪酬的问题,由于前段时间比较忙,所以没有及时一一 ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Git常用命令(转)
目前开发的新项目使用的版本控制工具基本用的都是Git,老项目用的还是Svn,网上Git资源也很多,多而杂.我整理了一份关于Git的学习资料,希望能帮助到正在学习Git的同学. 一. Git 命令初识 ...
- Oracle 多表关联更新
drop table course; create table course ( id integer, teacherNo integer, teacherDesc ), teacherName ) ...
- SSH框架总结(帧分析+环境结构+示例源代码下载)
首先,SSH不是一个框架.而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- Ubuntu14.04安装一个小问题,搜狗输入法
罕见的搜狗输入法支持ubuntu.尝试了决定性下载. 官方网站:http://pinyin.sogou.com/linux/ 官网教程:http://pinyin.sogou.com/linux/he ...