solrJ可以看成是solr的java版客戶端,提供基本的索引維護、檢索等功能。
solrJ和solr服務端有兩種“溝通”方式:
第一,利用http進行通信。
第二,直接訪問solrCore(solr配置文件、索引文件等),不需要http通信(without http)。
solrJ的SolrServer類結構如下圖所示:

EmbeddedSolrServer是第二種方式,CommonsHttpSolrServer,LBHttpSolrServer是第一種方式,
其中LBHttpSolrServer是在CommonsHttpSolrServer的基礎上提供了負載均衡的功能(load Balanced)。
在很多應用場景下,我們基本都會選擇CommonsHttpSolrServer(LBHttpSolrServer)的方式。最近筆者有這樣一個需求,在異構平台上,有多種語言開發的系統都需要對基礎數據進行檢索,如果每個系統都針對性的開發一個客戶端,主要缺陷是緊耦合。因此筆者考慮在solr的基礎上開發一套標准的webService接口發布服務,如果在solrCore的基礎上進行調整,調整量太大,如果借助solrJ的CommonsHttpSolrServer與solrServer進行溝通,那么就會多走一次http。最后發現EmbeddedSolrServer可以解決這個問題。
然后目前EmbeddedSolrServer也有一些問題需要處理,例如:multiCore、load Balanced等。
下面我們從檢索入手,初步了解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();
}
}
參考:
http://wiki.apache.org/solr/SolJava
http://wiki.apache.org/solr/Solrj
