Solr JAVA客户端SolrJ 4.9使用示例教程

简介

        SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对Solr提供了Rest 的HTTP接口进行了封装,SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。

SolrJ/Solr 跨版本兼容性

    SolrJ通常向后保持兼容性,可以使用新版本的SolrJ访问较旧的Solr,反之亦然。建议使用同Solr server同版本的SolrJ, 

    详见http://wiki.apache.org/solr/Solrj 中关于兼容性的描述。

示例代码

  •    采用SolrInputDocument对象增加、删除索引
  • import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.common.SolrInputDocument;
    
    public class AddDocsDemo {
    	public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    
    	public static void main(String[] args) {
    		//通过浏览器查看结果
    		//http://172.168.63.233:8983/solr/collection1/select?q=name%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
    		//AddDocs();
    		delDocs();
    	}
    
    	public static void AddDocs() {
    		String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    				"传统媒体与新媒体融合等", "相关内容文件", "习近平强调要", "逐步规范国有企业收入分配秩序",
    				"实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    				"深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    				"科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    				"建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    		long start = System.currentTimeMillis();
    		Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    		for (int i = 1; i < 300; i++) {
    			SolrInputDocument doc1 = new SolrInputDocument();
    			doc1.addField("id", "id" + i, 1.0f);
    			doc1.addField("name", words[i % 21], 1.0f);
    			doc1.addField("price", 10 * i);
    			docs.add(doc1);
    		}
    		try {
    			HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    			// 可以通过三种方式增加docs,其中server.add(docs.iterator())效率最高
    			// 增加后通过执行commit函数commit (936ms)
    //			 server.add(docs);
    //			 server.commit();
    
    			// 增加doc后立即commit (946ms)
    //			 UpdateRequest req = new UpdateRequest();
    //			 req.setAction(ACTION.COMMIT, false, false);
    //			 req.add(docs);
    //			 UpdateResponse rsp = req.process(server);
    
    			// the most optimal way of updating all your docs
    			// in one http request(432ms)
    			server.add(docs.iterator());
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    		System.out.println("time elapsed(ms):"
    				+ (System.currentTimeMillis() - start));
    	}
    
    	public static void delDocs() {
    		long start = System.currentTimeMillis();
    		try {
    			HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    			List<String> ids = new ArrayList<String>();
    			for (int i = 1; i < 300; i++) {
    				ids.add("id" + i);
    			}
    			server.deleteById(ids);
    			server.commit();
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    		System.out.println("time elapsed(ms):"
    				+ (System.currentTimeMillis() - start));
    	}
    }
  •     采用POJOs增加、删除索引
  • import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.List;
    import java.util.Random;
    
    import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
    import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.common.SolrInputDocument;
    
    public class AddBeansDemo {
    	public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    
    	public static void main(String[] args) {
    		// 通过浏览器查看结果
    		// 要保证bean中各属性的名称在conf/schema.xml中存在,如果查询,要保存被索引
    		// http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
    //		delBeans();
    		AddBeans();
    	}
    
    	public static Random rand = new Random(47);
    	public static String[] authors = { "张三", "李四", "王五", "赵六", "张飞", "刘备",
    			"关云长" };
    	public static String[] links = {
    			"http://repository.sonatype.org/content/sites/forge-sites/m2e/",
    			"http://news.ifeng.com/a/20140818/41626965_0.shtml",
    			"http://news.ifeng.com/a/20140819/41631363_0.shtml?wratingModule_1_9_1",
    			"http://news.ifeng.com/topic/19382/",
    			"http://news.ifeng.com/topic/19644/" };
    
    	public static String genAuthors() {
    		List<String> list = Arrays.asList(authors).subList(0, rand.nextInt(7));
    		String str = "";
    		for (String tmp : list) {
    			str += " " + tmp;
    		}
    		return str;
    	}
    
    	public static List<String> genLinks() {
    		return Arrays.asList(links).subList(0, rand.nextInt(5));
    	}
    
    	public static void AddBeans() {
    		String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    				"传统媒体与新媒体融合等", "相关内容文件", "习近平强调要", "逐步规范国有企业收入分配秩序",
    				"实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    				"深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    				"科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    				"建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    
    		long start = System.currentTimeMillis();
    		Collection<NewsBean> docs = new ArrayList<NewsBean>();
    //		DocumentObjectBinder binder = new DocumentObjectBinder();
    		for (int i = 1; i < 300; i++) {
    			NewsBean news = new NewsBean();
    			news.setId("id" + i);
    			news.setName("news" + i);
    			news.setAuthor(genAuthors());
    			news.setDescription(words[i % 21]);
    			news.setRelatedLinks(genLinks());
    //			SolrInputDocument doc1 = binder.toSolrInputDocument(news);
    			docs.add(news);
    		}
    		try {
    			HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    			server.setRequestWriter(new BinaryRequestWriter());
    			// 可以通过二种方式增加docs,其中server.add(docs.iterator())效率最高
    			// 增加后通过执行commit函数commit (981ms)
    			// server.addBeans(docs);
    			// server.commit();
    
    			// the most optimal way of updating all your docs
    			// in one http request(481ms)
    			server.addBeans(docs.iterator());
    			server.optimize(); //time elasped 1176ms
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    		System.out.println("time elapsed(ms):"
    				+ (System.currentTimeMillis() - start));
    	}
    
    	public static void delBeans() {
    		long start = System.currentTimeMillis();
    		try {
    			HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    			List<String> ids = new ArrayList<String>();
    			for (int i = 1; i < 300; i++) {
    				ids.add("id" + i);
    			}
    			server.deleteById(ids);
    			server.commit();
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    		System.out.println("time elapsed(ms):"
    				+ (System.currentTimeMillis() - start));
    	}
    }
    import java.util.List;
    
    import org.apache.solr.client.solrj.beans.Field;
    
    class NewsBean {
    	@Field
    	private String id;
    
    	@Field
    	private String name;
    
    	@Field
    	private String author;
    
    	@Field
    	private String description;
    
    	@Field("links")
    	private List<String> relatedLinks;
    
    	public NewsBean(){
    
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getAuthor() {
    		return author;
    	}
    
    	public void setAuthor(String author) {
    		this.author = author;
    	}
    
    	public String getDescription() {
    		return description;
    	}
    
    	public void setDescription(String description) {
    		this.description = description;
    	}
    
    	public List<String> getRelatedLinks() {
    		return relatedLinks;
    	}
    
    	public void setRelatedLinks(List<String> relatedLinks) {
    		this.relatedLinks = relatedLinks;
    	}
    }
  •     普通方式处理查询结果
  • import java.io.IOException;
    
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrQuery.ORDER;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.client.solrj.impl.XMLResponseParser;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    
    public class QueryDocsDemo {
    //	public static final String SOLR_URL = "http://192.168.230.128:8983/solr";
    	public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    
    	public static void main(String[] args) throws SolrServerException, IOException {
    		HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    		server.setMaxRetries(1);
    		server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    		server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    		//正常情况下,以下参数无须设置
    		//使用老版本solrj操作新版本的solr时,因为两个版本的javabin incompatible,所以需要设置Parser
    		server.setParser(new XMLResponseParser());
    		server.setSoTimeout(1000); // socket read timeout
    		server.setDefaultMaxConnectionsPerHost(100);
    		server.setMaxTotalConnections(100);
    		server.setFollowRedirects(false); // defaults to false
    		// allowCompression defaults to false.
    		// Server side must support gzip or deflate for this to have any effect.
    		server.setAllowCompression(true);
    
    		//使用ModifiableSolrParams传递参数
    //		ModifiableSolrParams params = new ModifiableSolrParams();
    //		// 192.168.230.128:8983/solr/select?q=video&fl=id,name,price&sort=price asc&start=0&rows=2&wt=json
    //		// 设置参数,实现上面URL中的参数配置
    //		// 查询关键词
    //		params.set("q", "video");
    //		// 返回信息
    //		params.set("fl", "id,name,price,score");
    //		// 排序
    //		params.set("sort", "price asc");
    //		// 分页,start=0就是从0开始,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了
    //		params.set("start", 2);
    //		params.set("rows", 2);
    //		// 返回格式
    //		params.set("wt", "javabin");
    //		QueryResponse response = server.query(params);
    
    		//使用SolrQuery传递参数,SolrQuery的封装性更好
    		server.setRequestWriter(new BinaryRequestWriter());
    		SolrQuery query = new SolrQuery();
    		query.setQuery("video");
    		query.setFields("id","name","price","score");
    		query.setSort("price", ORDER.asc);
    		query.setStart(0);
    		query.setRows(2);
    //		query.setRequestHandler("/select");
    		QueryResponse response = server.query( query );
    
    		// 搜索得到的结果数
    		System.out.println("Find:" + response.getResults().getNumFound());
    		// 输出结果
    		int iRow = 1;
    		for (SolrDocument doc : response.getResults()) {
    			System.out.println("----------" + iRow + "------------");
    			System.out.println("id: " + doc.getFieldValue("id").toString());
    			System.out.println("name: " + doc.getFieldValue("name").toString());
    			System.out.println("price: "
    					+ doc.getFieldValue("price").toString());
    			System.out.println("score: " + doc.getFieldValue("score"));
    			iRow++;
    		}
    	}
    }
  •     采用POJOs方式处理查询结果
  • import java.io.IOException;
    import java.util.List;
    
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrQuery.ORDER;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.client.solrj.response.FacetField;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    
    public class QueryBeanDemo {
    	public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    
    	public static void main(String[] args) throws SolrServerException,
    			IOException {
    		// http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%80%BB%E7%9B%AE%E6%A0%87&facet=true&facet.field=author_s
    		HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    		server.setMaxRetries(1);
    		server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    		server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    		// server.setRequestWriter(new BinaryRequestWriter());
    
    		SolrQuery query = new SolrQuery();
    		query.setQuery("description:改革");
    		query.setStart(0);
    		query.setRows(2);
    		query.setFacet(true);
    		query.addFacetField("author_s");
    
    		QueryResponse response = server.query(query);
    		// 搜索得到的结果数
    		System.out.println("Find:" + response.getResults().getNumFound());
    		// 输出结果
    		int iRow = 1;
    
    		//response.getBeans存在BUG,将DocumentObjectBinder引用的Field应该为 org.apache.solr.client.solrj.beans.Field
    		SolrDocumentList list = response.getResults();
    		DocumentObjectBinderL binder = new DocumentObjectBinderL();
    		List<NewsBean> beanList=binder.getBeans(NewsBean.class, list);
    		for(NewsBean news:beanList){
    			System.out.println(news.getId());
    		}
    
    		for (SolrDocument doc : response.getResults()) {
    			System.out.println("----------" + iRow + "------------");
    			System.out.println("id: " + doc.getFieldValue("id").toString());
    			System.out.println("name: " + doc.getFieldValue("name").toString());
    			iRow++;
    		}
    		for (FacetField ff : response.getFacetFields()) {
    			System.out.println(ff.getName() + "," + ff.getValueCount() + ","
    					+ ff.getValues());
    		}
    	}
    }

参考

http://wiki.apache.org/solr/Solrj

时间: 2024-10-30 22:25:00

Solr JAVA客户端SolrJ 4.9使用示例教程的相关文章

推荐Java五大微服务器及其代码示例教程

微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序作为较小的服务组合而更好地开发和管理,可将工作在一起,实现更大的应用程序范围的功能.工具正在上升,以满足使用逐块方法思考和构建应用程序的需求,与同时考虑整个应用程序相比.下面为大家讲述一下Java五大微服务器,使用这些功能的好处以及相关的代码示例. 什么是微服务 微服务是一种面向服务的架构风格(Java开发人员最重要的技能之一),其中应用程序被构建为不同的小型服务而不是整个应用程序的集合.您可以使用多个独立的

JAVA客户端调用memcached的比较

1.memcached client for java 客户端API:memcached client for java 网址:http://www.whalin.com/memcached 最新版本:java_memcached-release_2.0.1 操作示例: Java代码 import com.danga.MemCached.*; import org.apache.log4j.*; public class TestMemcached { public static void ma

Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用

 介绍 Memcached java client是官方推荐的最早的memcached java客户端.最新版本:java_memcached-release_2.6.1. 官方下载地址:https://github.com/gwhalin/Memcached-Java-Client 采用阻塞式SOCKET通讯,据说目前版本进行了很多优化,性能有所提高(只看过1.5的源代码,还没来及看最新的) 提供key方式的连接池,默认连接池key为default.(老版本了).2.6.1版本支持apac

电信网管中的Java客户端(二)

客户端|网管 电信网管中的Java客户端(二) 1.概述前文讲述了用Java开发电信网管界面系统遇到的困难.其中,制作网络拓扑图是我们第一个必须克服的困难.本文概述如何使用和制作网络拓扑图的产品和方法和思路. 2.电信网络拓扑组件的要求网络拓扑图是电信网管客户端的核心.对于电信网络,在使用任何网络拓扑组件时,必须注意电信网络的一些特点: · 数据量大.一般电信网络的规模都比较大,网络设备数量多,拓扑复杂.网络拓扑图界面必须考虑到能够处理大数据量的网络节点和连接. · 多层次展示网络.在一个综合电

java 客户端 服务器-java客户端和服务器通信

问题描述 java客户端和服务器通信 1C try{ Socket s=new Socket(""127.0.0.1""9997); System.out.println(s); InputStreamReader isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr);//接受客户端的消息 pw =new PrintWriter(s.getOutputStream()tru

ZPush--基于netty4实现的苹果通知推送服务(APNs)Java客户端

简单说下实现苹果通知推送服务(APNs)客户端的一些要注意的地方: 使用长连接: sanbox服务器是没用的,调试时直接用"gateway.push.apple.com"域名: 对于错误的Notification,苹果会回应一个Error response,里面有个identifier,在这个identifier之后的Notification全都失败: 因此发送者要缓存已经发送的Notification,最好设置Notification identifier为增长的整数序列,当收到Er

kafka linux下java客户端的详细编译步骤

问题描述 kafka linux下java客户端的详细编译步骤 求关于kafka在Linux 命令行下的java客户端详细编译步骤,网上直看到些程序代码但是具体编译过程很少

python服务端已写,对应怎么写java客户端?

问题描述 python服务端已写,对应怎么写java客户端? 以下是python服务端的代码: import SocketServerimport tracebackclass ServerHandler(SocketServer.StreamRequestHandler): def handle(self): addr = self.request.getpeername() print(""client connectaddress:""addr) #self.

信息通讯-java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端

问题描述 java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端 socket连接部分可以省略 只要客户端的发送数据部分和服务端的接收数据部分我主要不知道java和C#的字符集以及该用什么方法比较好 解决方案 C#可以用system.text.encoding命名空间下的Encoding.GetEncoding(字符串编码名).GetBytes/GetString编码解码.其中编码名支持常见的编码,比如utf gb2312 unicode等等. 解决方案二: c