通过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,0,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, 0, 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 =2;

            solr.Delete(b);
            solr.Commit();
        }

        private static void Index()
        {
            ISolrOperations<Book1> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Book1>>();

            Book1 b = new Book1();
            b.Id = 2;
            b.Title = "平凡的世界";
            b.Author = "路遥";

            solr.Add(b);

            Book1 b1 = new Book1();
            b1.Id = 3;
            b1.Title = "围城";
            b1.Author = "钱钟书";

            solr.Add(b1);

            Book1 b2 = new Book1();
            b2.Id = 4;
            b2.Title = "我要去打魔兽啊";
            b2.Author = "张剑";

            solr.Add(b2);

            Book1 b3 = new Book1();
            b3.Id = 5;
            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

时间: 2024-10-17 16:07:46

通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD的相关文章

微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别

假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionID该如何获取呢? 1,先看pc端的解决方案 以snsapi_login为scope发起网页授权,先拿网站应用的appid和secret用授权接口获取"网页授权access_token",再利用"网页授权access_token"通过"拉取用户信息的api接口&

实现多线程的两种方法:继承Thread类或实现Runnable接口

实现多线程的两种方法:继承Thread类或实现Runnable接口 Java中实现多线程有两种方法:继承Thread类和实现Runnable接口,在程序开发中只要是多线程,我们一般都是实现Runnable接口,原因归结为一点:实现接口比继承类要好. 多线程的第一种实现方式:继承Thread类 步骤如下 创建一个继承Thread的类(假定为A),并重写Thread的run方法 构造一个A类对象,假定为aa 调用aa的start方法.(start方法是从Thread继承过来的) 具体例子如下 pac

线程的启动的两种方法,Runnable接口,run()的调用

实现并启动线程有两种方法1.写一个类继承自Thread类,重写run方法.用start方法启动线程2.写一个类实现Runnable接口,实现run方法.用new Thread(Runnable target).start()方法来启动 多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run(). 调用start()后,线程会被放到等待队列,等待C

dll编程导出接口的两种方法

前言: 在vc中到处dll有两种方法: 第一种:是通过模块定义def文件,把要导出的函数接口放在里面,而def文件为链接器提供有关程序的到处,属性等方面的信息. 第二种:在函数声明中加上__declspec(dllexport): 第一种方法示例: 先构建一个名为:mousehook_dll的dll项目: 在hookLoad.h种声明两个接口函数: #pragma once BOOL StartHookEv(HWND hWnd); VOID StopHookEv(void) ; 在hookLoa

api暴露的接口有两种方法

接口检测是否正常,可以使用测试工具 postman insomnia 注意! express中一个路由 即 一个接口 api暴露的接口有两种方法 一.使用模板进行暴露,但要将数据做字符串转化,然后使用ejs的非转义输出 router.get('/',function(req,res,next){ res.render('main'{ //main 路由 mine:JSON.stringify({ ret:true, 认证权限 username:'ni hao' }) }) }) 二.使用json

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控 1.自带监控模板进行os的监控 进入/usr/local/zabbix/etc/zabbix_agentd.conf 配置文件修改 LogRemoteCommands=1     ###开启脚本功能 Server=192.168.5.129     ##修改zabbix指向的服务器: 重启zabbix_agentd.zabbix_server服务 在配置-->主机-->添加主机--> 配置主机信息主

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法.可以通过2种方法实现. 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接. 第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的

Intent传递对象的两种方法

Android为intent提供了两种传递对象参数类型的方法 分别需要使实体类实现Serializable接口.Parcelable接口 首先我们要知道,传递对象,需要先将对象序列化 一.那么为什么要对象序列化 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.用过序列化对象在网络中.进程间传递对象: 二.序列化对象什么时候实现Serializable接口,什么时候实现Parcelable接口接口 1.Parcelable不能使用将数据存储在磁盘上,因为Parcelable在外界有变化的