通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
前言
老规矩,任何技术的入门我通常都会总结增删改查,本文我就通过HttpWebRequest和SolrNet的方式实现Solr最基础的增删改查(CURD)。对于自己的完整项目,同时不想过于依赖第三方类库的则通过Http接口的方式来调用Solr。 当然也有人喜欢调用第三方的类库,简单方便,不需要自己处理太多繁琐的细节就可以轻松调用solr来实现自己的业务逻辑。
Http接口实现
private static void Query()
{ string url = "http://localhost:8080/solr/univeral/select?indent=on&q=title:魔兽&wt=json"; WebRequest request = WebRequest.Create(url);
request.Method = "GET";
WebResponse response = request.GetResponse(); Stream stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string strJson = reader.ReadToEnd();
Console.WriteLine(strJson);
}
} private static void Index()
{
string url = "http://localhost:8080/solr/univeral/update?_=1466592530544&wt=json&commit=true"; string strData = @"<add>
<doc>
<field name='id'>2</field>
<field name='title'>平凡的世界(根据路遥同名小说改变)</field>
<field name='author'>路遥</field>
</doc>
</add>"; byte[] bytes;
bytes = System.Text.Encoding.UTF8.GetBytes(strData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Accept = "*/*";
request.ContentLength = bytes.Length;
request.ContentType = "text/xml; encoding='utf-8'"; Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes,,bytes.Length);
requestStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string strJson = new StreamReader(responseStream).ReadToEnd();
Console.WriteLine(strJson);
} } private static void Delete()
{
string url = "http://localhost:8080/solr/univeral/update?_=1466592530544&wt=json&commit=true"; string strData = @"<delete><id>2</id></delete>"; byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(strData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Accept = "*/*";
request.ContentLength = bytes.Length;
request.ContentType = "text/xml; encoding='utf-8'"; Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, , bytes.Length);
requestStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string strJson = new StreamReader(responseStream).ReadToEnd();
Console.WriteLine(strJson);
} }
SolrNet实现
SolrNet最大的优势就是一直在更新,用户众多,并且在github上提供源代码(https://github.com/mausch/SolrNet)和说明文档(https://github.com/mausch/SolrNet/tree/master/Documentation)。
使用前先创建对应的model,字段和schema.xml中的字段对应,并使用属性SolrUniqueKey和SolrField标识主见和普通字段。
public class Book1
{
[SolrUniqueKey("id")]
public int Id { get; set; }
[SolrField("title")]
public string Title { get; set; }
[SolrField("author")]
public string Author { get; set; } }
主程序调用前先初始化:Startup.Init<Book1>("http://localhost:8080/solr/univeral/"); OK, 可以实现增删改查了。
private static void Delete()
{
ISolrOperations<Book1> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Book1>>(); Book1 b=new Book1();
b.Id =; solr.Delete(b);
solr.Commit();
} private static void Index()
{
ISolrOperations<Book1> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Book1>>(); Book1 b = new Book1();
b.Id = ;
b.Title = "平凡的世界";
b.Author = "路遥"; solr.Add(b); Book1 b1 = new Book1();
b1.Id = ;
b1.Title = "围城";
b1.Author = "钱钟书"; solr.Add(b1); Book1 b2 = new Book1();
b2.Id = ;
b2.Title = "我要去打魔兽啊";
b2.Author = "张剑"; solr.Add(b2); Book1 b3 = new Book1();
b3.Id = ;
b3.Title = "魔兽世界";
b3.Author = "张三"; solr.Add(b3); solr.Commit();
} private static void Query()
{
ISolrOperations<Book1> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Book1>>(); SolrQueryResults<Book1> solrResults = solr.Query(new SolrQuery("title:魔兽")); foreach (var solrQueryResult in solrResults)
{
Console.WriteLine("Id:" + solrQueryResult.Id+",Name:"+solrQueryResult.Title+",Author:"+solrQueryResult.Author);
}
Console.ReadLine();
}
SolrNet提供了SolrQuery的多个版本有兴趣的话可以看看它的源码,包括容器如何初始化,容器内部如何使用SolrConnection。也是一个不错的框架,值得推荐。
是否索引(indexed)、是否存储(stored)
你在配置schema.xml时注意到field的这几个字段了么? 我第一次配置时并没有关注这几个属性,只是觉的有些好奇,都是什么情况下需要设置这几个属性呢?这才专门查了它们几个之间的区别:
- indexed=true stored=true 需要用关键查询并需要在查询结果中显示。 如book.title、book.author
- indexed=false stored=true 不需要用关键字查询,但需要在查询结果中显示。 如book.destinationUrl
- indexed=true stored=false 需要用关键字查询但不需要在查询结果中显示。
参考资料
http://www.cnblogs.com/zhangweizhong/p/5073997.html
通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD的更多相关文章
- 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...
- C# web api返回类型设置为json的两种方法
web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...
- Intent传递对象的两种方法(Serializable,Parcelable) (转)
今天讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcela ...
- Intent传递对象的两种方法
Android为intent提供了两种传递对象参数类型的方法 分别需要使实体类实现Serializable接口.Parcelable接口 首先我们要知道,传递对象,需要先将对象序列化 一.那么为什么要 ...
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...
- Loadrunner 接口测试的两种方法
其实无论用那种测试方法,接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程. 方法一.用Lo ...
- 用Java集合中的Collections.sort方法对list排序的两种方法
用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- AE 将地图导出为图片的两种方法
在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中.将Map或Layout中的图象转出有两种方法,一种为通过IActiveView的OutPut函数,另外一种是通过IExpor ...
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)
Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...
随机推荐
- setTimeout 的黑魔法
setTimeout,前端工程师必定会打交道的一个函数.它看上去非常的简单,朴实.有着一个很不平凡的名字--定时器.让年少的我天真的以为自己可以操纵未来.却不知朴实之中隐含着惊天大密.我还记得我第一次 ...
- 谈一下关于CQRS架构如何实现高性能
CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- UIViewController生命周期-完整版
一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load (NSObje ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- PHP之购物车的代码
该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- 前端性能优化的另一种方式——HTTP2.0
最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1.1和HTTP2 ...
- JavaScript基础知识总结(三)
JavaScript语法 七.循环语句 1.while 语法: while (exp) { //statements; } 说明:while (变量<=结束值) { 需执行的代码 } 例子: / ...
- bzoj3208--记忆化搜索
题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目. 我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...