Solr JAVA客户端SolrJ 4.9使用示例教程
http://my.oschina.net/cloudcoder/blog/305024
简介
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());
}
}
}
Solr JAVA客户端SolrJ 4.9使用示例教程的更多相关文章
- Solr JAVA客户端SolrJ的使用
一.Solrj简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底 ...
- 推荐Java五大微服务器及其代码示例教程
来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...
- 使用SolrJ(即java客户端)开发Solr。
1.什么是SolrJ呢? 答:Solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务.开始配置schema ...
- Solr第二讲——SolrJ客户端的使用与案例
一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...
- elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...
- solr 学习之solrJ
solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...
- Solr——Java应用
Solr有一个客户端SolrJ 创建一个Java Project 引入Jar包 添加test类 package com.solr.test; import java.io.IOException; i ...
- Java与WCF交互(一)补充:用WSImport生成WSDL的Java客户端代码
在<Java与WCF交互(一):Java客户端调用WCF服务>一 文中,我描述了用axis2的一个Eclipse控件生成WCF的Java客户端代理类,后来有朋友建议用Xfire.CXF,一 ...
- Java与WCF交互(一):Java客户端调用WCF服务
最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...
随机推荐
- flume-ng 集群搭脚本
#!/bin/bash # author: xirong # date : -- ##### 搭建 flume 集群的脚本 # 注意: # . 需要 jdk7 环境,如果没有 Java 环境,请配置 ...
- struct和typedef struct
转自:http://www.cnblogs.com/qyaizs/articles/2039101.html struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++ ...
- 修改Apache配置文件开启gzip压缩传输
转自:http://down.chinaz.com/server/201202/1645_1.htm 最近无事研究一些Web的优化,用工具page speed检测网站时发现还没有开启gzip压缩,于是 ...
- 第一次尝试用 Live Writer 写博客
之前在官网上下载了最新版的Windows Live Writer,可是安装不了,就在其他网站下了一个试试,可以安装,不过却是2009年的版本,很不喜欢,我希望能体验最新版的,回头还得重新下个最新版的安 ...
- iOS和Android的app界面设计规范(转)
记录一下iOS和Andoird的界面设计规范,方便进行标准的产品设计,并与设计师顺畅沟通 iOS篇 界面尺寸 设备 分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×22 ...
- C# 指针操作图像 二值化处理
/// <summary> /// 二值化图像 /// </summary> /// <param name="bmp"></param& ...
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- Open judge C16H:Magical Balls 快速幂+逆元
C16H:Magical Balls 总时间限制: 1000ms 内存限制: 262144kB 描述 Wenwen has a magical ball. When put on an infin ...
- NSDate用法整理总结
int main(int argc, const char * argv[]) { @autoreleasepool { NSDate *date=[NSDate date]; NSLog(@&quo ...
- thinkphp数据表操作恐怖事件。
1当使用thinkphp的where(array())时,如果里面的字段在数据库是没有的,则默认这个条件为1,这时就可能出现大批修改记录问题.如修改所有用户的密码.特别要注意的是,这里的表字段是区分大 ...