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 ...
随机推荐
- 原生js 样式的操作整理
内联样式的获取 function getStyle(obj,attr){//简单的获取内联样式 return obj.currentStyle?obj.currentStyle[attr]:obj.g ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- IT互联网行业中相关职能的缩写
RD – Research & Develop 研发FE – Front End 前端QA – Quality Assurance 测试DBA – Database Administrator ...
- Git与TortoiseGit基本操作(转)
1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(Check out ...), 更新 (U ...
- 开展project
正常的生活之路
相对刚走出学校的学生在其他行业工作,竞争力的薪酬,同时.并不断地不仅学习更新专业知识让你感到生活的充实,更满足了你那不让外人知的虚荣心.在刚出校门的几年中,你常常回头看看被你落在后面的同学们,在内心怜 ...
- wikioi 1002 旁路
意甲冠军:这个问题刚开始的问题,有错误的含义,原桥始建于一条直线.无论多么遥远. 思维:dfs寻求答案的第一个问题.然后做最小生成树,双方不能大桥将设置INF即可了.然后假设用到INF的边就加上0即可 ...
- H264 编解码器架构简单
看完后H264/AVC 编解码器演示,头脑是刚刚离开以下三个: 1.H264并且不明白如何指定的编解码器来实现,仅定义了一个编码视频位流的语法.和比特流进行解码,这与MPEG 类似. 2.H264而一 ...
- 左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用
文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy201 ...
- 【C++实现】HeadFirst策略模式设计模式
策略模式定义了算法家族.分别封装起来.让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户. Head First设计模式中介绍策略模式时以Duck类作为样例.当中用flyBehavior和 ...
- boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)
本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...