solr实战代码事例
2016-01-28 09:03
323 查看
三、利用SolrJ操作solrAPI,完成index操作
使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法,来操作solr的API的。SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作。1、首先,你需要添加如下jar包
其中apache-solr-solrj-3.4.0.jar、slf4j-api-1.6.1.jar可以在下载的apache-solr-3.4.0的压缩包中的dist中能找到。
2、其次,建立一个简单的测试类,完成Server对象的相关方法的测试工作,代码如下:
packagecom.hoo.test;
importjava.io.IOException;
importjava.net.MalformedURLException;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.List;
importorg.apache.solr.client.solrj.SolrQuery;
importorg.apache.solr.client.solrj.SolrServer;
importorg.apache.solr.client.solrj.SolrServerException;
importorg.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
importorg.apache.solr.client.solrj.response.QueryResponse;
importorg.apache.solr.client.solrj.response.UpdateResponse;
importorg.apache.solr.common.SolrDocumentList;
importorg.apache.solr.common.SolrInputDocument;
importorg.apache.solr.common.params.ModifiableSolrParams;
importorg.apache.solr.common.params.SolrParams;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importcom.hoo.entity.Index;
/**
*<b>function:</b>ServerTestCase
*@authorhoojo
*@createDate2011-10-19下午01:49:07
*@fileServerTest.java
*@packagecom.hoo.test
*@projectSolrExample
*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code] *@emailhoojo_@126.com*@version1.0*/publicclassServerTest{privateSolrServerserver;privateCommonsHttpSolrServerhttpServer;privatestaticfinalStringDEFAULT_URL="http://localhost:8983/solr/";@Beforepublicvoidinit(){try{server=newCommonsHttpSolrServer(DEFAULT_URL);httpServer=newCommonsHttpSolrServer(DEFAULT_URL);}catch(MalformedURLExceptione){e.printStackTrace();}}@Afterpublicvoiddestory(){server=null;httpServer=null;System.runFinalization();System.gc();}publicfinalvoidfail(Objecto){System.out.println(o);}/***<b>function:</b>测试是否创建server对象成功*@authorhoojo*@createDate2011-10-21上午09:48:18*/@Testpublicvoidserver(){fail(server);fail(httpServer);}/***<b>function:</b>根据query参数查询索引*@authorhoojo*@createDate2011-10-21上午10:06:39*@paramquery*/publicvoidquery(Stringquery){SolrParamsparams=newSolrQuery(query);try{QueryResponseresponse=server.query(params);SolrDocumentListlist=response.getResults();for(inti=0;i<list.size();i++){fail(list.get(i));}}catch(SolrServerExceptione){e.printStackTrace();}}}
测试运行servercase方法,如果成功创建对象,那你就成功的链接到。
注意:在运行本方法之前,请启动你的solr官方自动的项目。http://localhost:8983/solr/保证能够成功访问这个工程。因为接下来的所有工作都是围绕这个solr工程完成的。如果你现在还不知道,怎么部署、发布官方solr工程,请参考前面的具体章节。
3、Server的有关配置选项参数,server是CommonsHttpSolrServer的实例server.setSoTimeout(1000);//socketreadtimeoutserver.setConnectionTimeout(100);server.setDefaultMaxConnectionsPerHost(100);server.setMaxTotalConnections(100);server.setFollowRedirects(false);//defaultstofalse//allowCompressiondefaultstofalse.//Serversidemustsupportgzipordeflateforthistohaveanyeffect.server.setAllowCompression(true);server.setMaxRetries(1);//defaultsto0.>1notrecommended.//sorlrJ目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。server.setParser(newXMLResponseParser());//二进制流输出格式//server.setRequestWriter(newBinaryRequestWriter());
4、利用SolrJ完成IndexDocument的添加操作/***<b>function:</b>添加doc文档*@authorhoojo*@createDate2011-10-21上午09:49:10*/@TestpublicvoidaddDoc(){//创建doc文档SolrInputDocumentdoc=newSolrInputDocument();doc.addField("id",1);doc.addField("name","SolrInputDocument");doc.addField("manu","thisisSolrInputDocumentcontent");try{//添加一个doc文档UpdateResponseresponse=server.add(doc);fail(server.commit());//commit后才保存到索引库fail(response);fail("querytime:"+response.getQTime());fail("ElapsedTime:"+response.getElapsedTime());fail("status:"+response.getStatus());}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}query("name:solr");}
在apache-solr-3.4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置,schema.xml中的field就和上面Document文档中的field(id、name、manu)对应。如果出现ERROR:unknownfield'xxxx'就表示你设置的这个field在schema.xml中不存在。如果一定要使用这个field,请你在schema.xml中进行filed元素的配置。具体请参考前面的章节。
注意:在schema.xml中配置了uniqueKey为id,就表示id是唯一的。如果在添加Document的时候,id重复添加。那么后面添加的相同id的doc会覆盖前面的doc,类似于update更新操作,而不会出现重复的数据。
5、利用SolrJ添加多个Document,即添加文档集合/***<b>function:</b>添加docs文档集合*@authorhoojo*@createDate2011-10-21上午09:55:01*/@TestpublicvoidaddDocs(){Collection<SolrInputDocument>docs=newArrayList<SolrInputDocument>();SolrInputDocumentdoc=newSolrInputDocument();doc.addField("id",2);doc.addField("name","SolrInputDocuments1");doc.addField("manu","thisisSolrInputDocuments1content");docs.add(doc);doc=newSolrInputDocument();doc.addField("id",3);doc.addField("name","SolrInputDocuments2");doc.addField("manu","thisisSolrInputDocuments3content");docs.add(doc);try{//adddocsUpdateResponseresponse=server.add(docs);//commit后才保存到索引库fail(server.commit());fail(response);}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}query("solr");}
就是添加一个List集合
6、添加JavaEntityBean,这个需要先创建一个JavaBean,然后来完成添加操作;
JavaBean:Index的代码packagecom.hoo.entity;importorg.apache.solr.client.solrj.beans.Field;/***<b>function:</b>JavaEntityBean;Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中*@authorhoojo*@createDate2011-10-19下午05:33:27*@fileIndex.java*@packagecom.hoo.entity*@projectSolrExample*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code] *@emailhoojo_@126.com*@version1.0*/publicclassIndex{//@Fieldsetter方法上添加Annotation也是可以的privateStringid;@FieldprivateStringname;@FieldprivateStringmanu;@FieldprivateString[]cat;@FieldprivateString[]features;@Fieldprivatefloatprice;@Fieldprivateintpopularity;@FieldprivatebooleaninStock;publicStringgetId(){returnid;}@FieldpublicvoidsetId(Stringid){this.id=id;}//getter、setter方法publicStringtoString(){returnthis.id+"#"+this.name+"#"+this.manu+"#"+this.cat;}}
注意上面的属性是和在apache-solr-3.4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置对应的。如果你IndexJavaBean中出现的属性在schema.xml的field配置无法找到,那么出出现unknownfiled错误。
添加Bean完成doc添加操作/***<b>function:</b>添加JavaEntityBean*@authorhoojo*@createDate2011-10-21上午09:55:37*/@TestpublicvoidaddBean(){//Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中Indexindex=newIndex();index.setId("4");index.setName("addbeanindex");index.setManu("indexbeanmanu");index.setCat(newString[]{"a1","b2"});try{//添加IndexBean到索引库UpdateResponseresponse=server.addBean(index);fail(server.commit());//commit后才保存到索引库fail(response);}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}queryAll();}
7、添加Bean集合/***<b>function:</b>添加EntityBean集合到索引库*@authorhoojo*@createDate2011-10-21上午10:00:55*/@TestpublicvoidaddBeans(){Indexindex=newIndex();index.setId("6");index.setName("addbeansindex1");index.setManu("indexbeansmanu1");index.setCat(newString[]{"a","b"});List<Index>indexs=newArrayList<Index>();indexs.add(index);index=newIndex();index.setId("5");index.setName("addbeansindex2");index.setManu("indexbeansmanu2");index.setCat(newString[]{"aaa","bbbb"});indexs.add(index);try{//添加索引库UpdateResponseresponse=server.addBeans(indexs);fail(server.commit());//commit后才保存到索引库fail(response);}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}queryAll();}
8、删除索引Document/***<b>function:</b>删除索引操作*@authorhoojo*@createDate2011-10-21上午10:04:28*/@Testpublicvoidremove(){try{//删除id为1的索引server.deleteById("1");server.commit();query("id:1");//根据id集合,删除多个索引List<String>ids=newArrayList<String>();ids.add("2");ids.add("3");server.deleteById(ids);server.commit(true,true);query("id:3id:2");//删除查询到的索引信息server.deleteByQuery("id:4id:6");server.commit(true,true);queryAll();}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}
9、查询索引/***<b>function:</b>查询所有索引信息*@authorhoojo*@createDate2011-10-21上午10:05:38*/@TestpublicvoidqueryAll(){ModifiableSolrParamsparams=newModifiableSolrParams();//查询关键词,*:*代表所有属性、所有值,即所有indexparams.set("q","*:*");//分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。params.set("start",0);params.set("rows",Integer.MAX_VALUE);//排序,,如果按照id排序,,那么将scoredesc改成iddesc(orasc)params.set("sort","scoredesc");//返回信息*为全部这里是全部加上score,如果不加下面就不能使用scoreparams.set("fl","*,score");try{QueryResponseresponse=server.query(params);SolrDocumentListlist=response.getResults();for(inti=0;i<list.size();i++){fail(list.get(i));}}catch(SolrServerExceptione){e.printStackTrace();}}
10、其他和Server有关方法/***<b>function:</b>其他server相关方法测试*@authorhoojo*@createDate2011-10-21上午10:02:03*/@TestpublicvoidotherMethod(){fail(server.getBinder());try{fail(server.optimize());//合并索引文件,可以优化索引、提供性能,但需要一定的时间fail(server.ping());//ping服务器是否连接成功Indexindex=newIndex();index.setId("299");index.setName("addbeanindex199");index.setManu("indexbeanmanu199");index.setCat(newString[]{"a199","b199"});UpdateResponseresponse=server.addBean(index);fail("response:"+response);queryAll();//回滚掉之前的操作,rollbackaddBeanoperationfail("rollback:"+server.rollback());//提交操作,提交后无法回滚之前操作;发现addBean没有成功添加索引fail("commit:"+server.commit());queryAll();}catch(SolrServerExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}
11、文档查询/***<b>function:</b>query基本用法测试*@authorhoojo*@createDate2011-10-20下午04:44:28*/@TestpublicvoidqueryCase(){//AND并且SolrQueryparams=newSolrQuery("name:appleANDmanu:inc");//OR或者params.setQuery("name:appleORmanu:apache");//空格等同于ORparams.setQuery("name:servermanu:dell");//params.setQuery("name:solr-manu:inc");//params.setQuery("name:server+manu:dell");//查询name包含solrappleparams.setQuery("name:solr,apple");//manu不包含incparams.setQuery("name:solr,appleNOTmanu:inc");//50<=price<=200params.setQuery("price:[50TO200]");params.setQuery("popularity:[5TO6]");//params.setQuery("price:[50TO200]-popularity:[5TO6]");//params.setQuery("price:[50TO200]+popularity:[5TO6]");//50<=price<=200AND5<=popularity<=6params.setQuery("price:[50TO200]ANDpopularity:[5TO6]");params.setQuery("price:[50TO200]ORpopularity:[5TO6]");//过滤器查询,可以提高性能filter类似多个条件组合,如and//params.addFilterQuery("id:VA902B");//params.addFilterQuery("price:[50TO200]");//params.addFilterQuery("popularity:[*TO5]");//params.addFilterQuery("weight:*");//0<popularity<6没有等于//params.addFilterQuery("popularity:{0TO6}");//排序params.addSortField("id",ORDER.asc);//分页:start开始页,rows每页显示记录条数//params.add("start","0");//params.add("rows","200");//params.setStart(0);//params.setRows(200);//设置高亮params.setHighlight(true);//开启高亮组件params.addHighlightField("name");//高亮字段params.setHighlightSimplePre("<fontcolor='red'>");//标记,高亮关键字前缀params.setHighlightSimplePost("</font>");//后缀params.setHighlightSnippets(1);//结果分片数,默认为1params.setHighlightFragsize(1000);//每个分片的最大长度,默认为100//分片信息params.setFacet(true).setFacetMinCount(1).setFacetLimit(5)//段.addFacetField("name")//分片字段.addFacetField("inStock");//params.setQueryType("");try{QueryResponseresponse=server.query(params);/*List<Index>indexs=response.getBeans(Index.class);for(inti=0;i<indexs.size();i++){fail(indexs.get(i));}*///输出查询结果集SolrDocumentListlist=response.getResults();fail("queryresultnums:"+list.getNumFound());for(inti=0;i<list.size();i++){fail(list.get(i));}//输出分片信息List<FacetField>facets=response.getFacetFields();for(FacetFieldfacet:facets){fail(facet);List<Count>facetCounts=facet.getValues();for(FacetField.Countcount:facetCounts){System.out.println(count.getName()+":"+count.getCount());}}}catch(SolrServerExceptione){e.printStackTrace();}}
12、分片查询、统计/***<b>function:</b>分片查询,可以统计关键字及出现的次数、或是做自动补全提示*@authorhoojo*@createDate2011-10-20下午04:54:25*/@TestpublicvoidfacetQueryCase(){SolrQueryparams=newSolrQuery("*:*");//排序params.addSortField("id",ORDER.asc);params.setStart(0);params.setRows(200);//Facet为solr中的层次分类查询//分片信息params.setFacet(true).setQuery("*:*").setFacetMinCount(1).setFacetLimit(5)//段//.setFacetPrefix("electronics","cat").setFacetPrefix("cor")//查询manu、name中关键字前缀是cor的.addFacetField("manu").addFacetField("name");//分片字段try{QueryResponseresponse=server.query(params);//输出查询结果集SolrDocumentListlist=response.getResults();fail("Queryresultnums:"+list.getNumFound());for(inti=0;i<list.size();i++){fail(list.get(i));}fail("Allfacetfiledresult:");//输出分片信息List<FacetField>facets=response.getFacetFields();for(FacetFieldfacet:facets){fail(facet);List<Count>facetCounts=facet.getValues();for(FacetField.Countcount:facetCounts){//关键字-出现次数fail(count.getName()+":"+count.getCount());}}fail("Searchfacet[name]filedresult:");//输出分片信息FacetFieldfacetField=response.getFacetField("name");List<Count>facetFields=facetField.getValues();for(Countcount:facetFields){//关键字-出现次数fail(count.getName()+":"+count.getCount());}}catch(SolrServerExceptione){e.printStackTrace();}}
分片查询在某些统计关键字的时候还是很有用的,可以统计关键字出现的次数,可以通过统计的关键字来搜索相关文档的信息。四、Document文档和JavaBean相互转换
这里转换的Bean是一个简单的User对象packagecom.hoo.entity;importjava.io.Serializable;importorg.apache.solr.client.solrj.beans.Field;/***<b>function:</b>UserEntityBean;所有被添加Annotation@Field注解的属性将参与index操作*@authorhoojo*@createDate2011-10-19下午04:16:00*@fileUser.java*@packagecom.hoo.entity*@projectSolrExample*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code] *@emailhoojo_@126.com*@version1.0*/publicclassUserimplementsSerializable{/***@authorHoojo*/privatestaticfinallongserialVersionUID=8606788203814942679L;//@Fieldprivateintid;@FieldprivateStringname;@Fieldprivateintage;/***可以给某个属性重命名,likes就是solrindex的属性;在solrIndex中将显示like为likes*/@Field("likes")privateString[]like;@FieldprivateStringaddress;@FieldprivateStringsex;@FieldprivateStringremark;publicintgetId(){returnid;}//setter方法上面也可以@FieldpublicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}//getter、setter@OverridepublicStringtoString(){returnthis.id+"#"+this.name+"#"+this.age+"#"+this.like+"#"+this.address+"#"+this.sex+"#"+this.remark;}}
测试类代码如下packagecom.hoo.test;importorg.apache.solr.client.solrj.beans.DocumentObjectBinder;importorg.apache.solr.common.SolrDocument;importorg.apache.solr.common.SolrDocumentList;importorg.apache.solr.common.SolrInputDocument;importorg.apache.solr.common.SolrInputField;importorg.junit.Test;importcom.hoo.entity.User;/***<b>function:</b>SolrInputDocumentimplementsMap,Iterable*@authorhoojo*@createDate2011-10-19下午03:54:54*@fileSolrInputDocumentTest.java*@packagecom.hoo.test*@projectSolrExample*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code] *@emailhoojo_@126.com*@version1.0*/publicclassSolrInputDocumentTest{publicfinalvoidfail(Objecto){System.out.println(o);}/***<b>function:</b>创建SolrInputDocument*@authorhoojo*@createDate2011-10-21下午03:38:20*/@TestpublicvoidcreateDoc(){SolrInputDocumentdoc=newSolrInputDocument();doc.addField("id",System.currentTimeMillis());doc.addField("name","SolrInputDocument");doc.addField("age",22,2.0f);doc.addField("like",newString[]{"music","book","sport"});doc.put("address",newSolrInputField("guangzhou"));doc.setField("sex","man");doc.setField("remark","chinapeople",2.0f);fail(doc);}/***<b>function:</b>利用DocumentObjectBinder对象将SolrInputDocument和User对象相互转换*@authorhoojo*@createDate2011-10-21下午03:38:40*/@TestpublicvoiddocAndBean4Binder(){SolrDocumentdoc=newSolrDocument();doc.addField("id",456);doc.addField("name","SolrInputDocument");doc.addField("likes",newString[]{"music","book","sport"});doc.put("address","guangzhou");doc.setField("sex","man");doc.setField("remark","chinapeople");DocumentObjectBinderbinder=newDocumentObjectBinder();Useruser=newUser();user.setId(222);user.setName("JavaBean");user.setLike(newString[]{"music","book","sport"});user.setAddress("guangdong");fail(doc);//User->>SolrInputDocumentfail(binder.toSolrInputDocument(user));//SolrDocument->>Userfail(binder.getBean(User.class,doc));SolrDocumentListlist=newSolrDocumentList();list.add(doc);list.add(doc);//SolrDocumentList->>Listfail(binder.getBeans(User.class,list));}/***<b>function:</b>SolrInputDocument的相关方法*@authorhoojo*@createDate2011-10-21下午03:44:30*/@TestpublicvoiddocMethod(){SolrInputDocumentdoc=newSolrInputDocument();doc.addField("id",System.currentTimeMillis());doc.addField("name","SolrInputDocument");doc.addField("age",23,1.0f);doc.addField("age",22,2.0f);doc.addField("age",24,0f);fail(doc.entrySet());fail(doc.get("age"));//排名有用,类似百度竞价排名doc.setDocumentBoost(2.0f);fail(doc.getDocumentBoost());fail(doc.getField("name"));fail(doc.getFieldNames());//keysfail(doc.getFieldValues("age"));fail(doc.getFieldValues("id"));fail(doc.values());}}
相关文章推荐
- 出现java.lang.UnsupportedClassVersionError 错误的原因
- Thread-Local Variables线程局部变量
- 设计模式—适配器模式(Go语言描述)
- phpcms二次开发
- HDOJ 1096 A+B for Input-Output Practice (VIII)
- qt 静态成员函数
- Spring MVC +Mybatis + Maven 配置之Transaction配置
- C++ 读取INI文件
- HDOJ 1094 A+B for Input-Output Practice (VI)
- 代码开发管理: 持续集成
- 淘宝店铺基础版全屏装修步骤及代码,已经经过测试
- asp.net服务器控件button先执行js再执行后台的方法
- Spring注解@Component、@Repository、@Service、@Controller区别
- HDOJ 1094 A+B for Input-Output Practice (VII)
- 怎么写一个“完美”的单例模式
- HDOJ 1093 A+B for Input-Output Practice (V)
- SSH-Struts(一)——基本原理
- HDOJ 1091 A+B for Input-Output Practice (IV)
- HDOJ 1091 A+B for Input-Output Practice (III)
- 【C语言】数字在排序数组中出现的次数(改动)