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

来源:互联网 发布:java有什么新技术 编辑:程序博客网 时间:2024/05/22 09:46

简介

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 {@Fieldprivate String id;@Fieldprivate String name;@Fieldprivate String author;@Fieldprivate 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,所以需要设置Parserserver.setParser(new XMLResponseParser());server.setSoTimeout(1000); // socket read timeoutserver.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_sHttpSolrServer 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.FieldSolrDocumentList 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());}}}
1 0
原创粉丝点击