[ solr入门 ] - 利用solrJ进行检索html
solrJ能够当作是solr的java版客户端,提供基本的索引维护、检索等功能。java
solrJ和solr服务端有两种“沟通”方式:web
第一,利用http进行通讯。负载均衡
第二,直接访问solrCore(solr配置文件、索引文件等),不须要http通讯(without http)。ui
solrJ的SolrServer类结构以下图所示:url

EmbeddedSolrServer是第二种方式,CommonsHttpSolrServer,LBHttpSolrServer是第一种方式,spa
其中LBHttpSolrServer是在CommonsHttpSolrServer的基础上提供了负载均衡的功能(load Balanced)。code
在不少应用场景下,咱们基本都会选择CommonsHttpSolrServer(LBHttpSolrServer)的方式。最近笔者有这样一个需求,在异构平台上,有多种语言开发的系统都须要对基础数据进行检索,若是每一个系统都针对性的开发一个客户端,主要缺陷是紧耦合。所以笔者考虑在solr的基础上开发一套标准的webService接口发布服务,若是在solrCore的基础上进行调整,调整量太大,若是借助solrJ的CommonsHttpSolrServer与solrServer进行沟通,那么就会多走一次http。最后发现EmbeddedSolrServer能够解决这个问题。server
而后目前EmbeddedSolrServer也有一些问题须要处理,例如:multiCore、load Balanced等。htm
下面咱们从检索入手,初步了解solrJ的使用方法。
第一步:创建solrJ客户端的“通信员”(CommonsHttpSolrServer)
SolrServer server = new CommonsHttpSolrServer( url ); |
第二步:检索
方式一:借助SolrRequestParsers解析“检索字符串”进行检索
public void query01(String queryString) { SolrParams solrParams = SolrRequestParsers .parseQueryString(queryString); try { QueryResponse rsp = solr.query(solrParams); List<PatentBean> results = rsp.getBeans(PatentBean. class ); for (PatentBean bean : results) System.out.println(bean.toString()); } catch (SolrServerException e) { e.printStackTrace(); } } |
queryString:String queryString = "q=ti:汽车&version=2.2&start=0&rows=10&indent=on";
这种方式简单,可是在应用中经过拼接字符串是比较憋足的,因此这种方式应用较少。
注意:
List<PatentBean> results = rsp.getBeans(PatentBean.class);Bean这种方式,无论索引维护,仍是检索都十分方便。
方式二:借助ModifiableSolrParams对象接收查询条件进行检索
public void query02(String queryString) { ModifiableSolrParams solrParams = new ModifiableSolrParams(); solrParams.add( "q" , queryString); solrParams.add( "start" , "0" ); solrParams.add( "rows" , "10" ); try { QueryResponse rsp = solr.query(solrParams); List<PatentBean> results = rsp.getBeans(PatentBean. class ); for (PatentBean bean : results) System.out.println(bean.toString()); } catch (SolrServerException e) { e.printStackTrace(); } } |
这种方式和第一种相似,若是第一种方式用个StringBuilt接收参数,那么就没什么两样了!
方式三:借助solrQuery对象接收查询条件进行检索
public void query02(String queryString) { SolrQuery query = new SolrQuery(); query.setQuery(queryString); query.setStart( 0 ); query.setRows( 10 ); QueryResponse rsp; try { rsp = solr.query(query); List<PatentBean> results = rsp.getBeans(PatentBean. class ); for (PatentBean bean : results) System.out.println(bean.toString()); } catch (SolrServerException e) { e.printStackTrace(); } } |
添加高亮效果:
query.setHighlight( true ).setHighlightSnippets( 1 ); query.setParam( "hl.fl" , "ti" ); |
使用EmbeddedSolrServer进行检索
建立EmbeddedSolrServer对象,以下:
private static CoreContainer.Initializer initializer = null ; private static CoreContainer coreContainer = null ; private static EmbeddedSolrServer server = null ; static { try { System.setProperty( "solr.solr.home" , "D:/solrHome/example/solr02" ); initializer = new CoreContainer.Initializer(); coreContainer = initializer.initialize(); server = new EmbeddedSolrServer(coreContainer, "" ); } catch (Exception e) { e.printStackTrace(); } } |