HttpSolrServer
HttpSolrServer使用HTTPClient 和solr服務器進行通信。
String url = "http://localhost:8080/solr"; SolrServer server = new HttpSolrServer(url);
HttpSolrServer 是線程安全的,建議重復使用HttpSolrServer 實例。
HttpSorlrServer 允許設置鏈接屬性
String url = "http://localhost:8080/solr" HttpSolrServer server = new HttpSolrServer( url ); server.setSoTimeout(1000); // socket read timeout server.setConnectionTimeout(100); 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); server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
EmbeddedSolrServer
EmbeddedSorrServer提供和HttpSorlrServer相同的接口,它不需要http連接
//注意,下面的屬性也是可以在jvm參數里面設置的 System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr"); CoreContainer.Initializer initializer = new CoreContainer.Initializer(); CoreContainer coreContainer = initializer.initialize(); EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");
如果你想要使用 Multicore 特性,那么你可以這樣使用:
File home = new File( getSolrHome() ); File f = new File( home, "solr.xml" ); multicore.load( getSolrHome(), f ); EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );
如果你在你的項目中內嵌solr服務,這將是一個不錯的選擇。無論你能否使用http,它都提供相同的接口
用法
solrj 被設計成一個可擴展的框架,用以向solr服務器提交請求,並接收回應。
我們已經將最通用的一些命令封裝在了solrServer類中了。
Adding Data to Solr添加DOC到Solr索引
首先需要獲得一個server的實例,
SolrServer server = getSolrServer();
如果,你使用的是一個遠程的solrServer的話呢,你或許會這樣來實現getSolrServer()這個方法:
public SolrServer getSolrServer(){ return new HttpSolrServer(url); }
如果,你使用的是一個本地的solrServer的話,你或許會這樣來實現getSolrServer()方法:
public SolrServer getSolrServer(){ //the instance can be reused return new EmbeddedSolrServer(); }
如果,你在添加數據之前,想清空現有的索引,那么你可以這么做:
server.deleteByQuery( "*:*" );// delete everything!
構造一個document
SolrInputDocument doc1 = new SolrInputDocument(); doc1.addField( "id", "id1", 1.0f ); doc1.addField( "name", "doc1", 1.0f ); doc1.addField( "price", 10 );
構造另外一個文檔,每個文檔都能夠被獨自地提交給solr,但是,批量提交是更高效的。每一個對SolrServer的請求都是http請求,當然對於EmbeddedSolrServer來說,是不一樣的。
SolrInputDocument doc2 = new SolrInputDocument(); doc2.addField( "id", "id2", 1.0f ); doc2.addField( "name", "doc2", 1.0f ); doc2.addField( "price", 20 );
構造一個文檔的集合
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); docs.add( doc1 ); docs.add( doc2 );
將documents提交給solr
server.add( docs );
提交一個commit
server.commit();
在添加完documents后,立即做一個commit,你可以這樣來寫你的程序:
UpdateRequest req = new UpdateRequest(); req.setAction( UpdateRequest.ACTION.COMMIT, false, false ); req.add( docs ); UpdateResponse rsp = req.process( server );
Directly adding POJOs to Solr
使用 java 注釋創建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一個域的名稱跟bean的名稱是不一樣的,那么在java注釋中填寫別名,具體的,可以參照下面的域categories
import org.apache.solr.client.solrj.beans.Field; public class Item { @Field String id; @Field("cat") String[] categories; @Field List<String> features; }
java注釋也可以使用在setter方法上,如下面的例子:
@Field("cat") public void setCategory(String[] c){ this.categories = c; }
創建bean實例
Item item = new Item(); item.id = "one"; item.categories = new String[] { "aaa", "bbb", "ccc" };
添加給Solr
server.addBean(item);
將多個bean提交給solr
List<Item> beans ; //add Item objects to the list server.addBeans(beans);
注意: 你可以重復使用SolrServer,這樣可以提高性能。
Reading Data from Solr搜索
獲取solrserver的實例
SolrServer server = getSolrServer();
構造 SolrQuery
SolrQuery query = new SolrQuery(); query.setQuery( "*:*" ); query.addSortField( "price", SolrQuery.ORDER.asc );
向服務器發出查詢請求
QueryResponse rsp = server.query( query );
獲取結果。
SolrDocumentList docs = rsp.getResults();
想要以javabean的方式獲取結果,那么這個javabean必須像之前的例子一樣有java注釋
List<Item> beans = rsp.getBeans(Item.class);
高級用法
solrJ 提供了一組API,來幫助我們創建查詢,下面是一個faceted query的例子。
SolrServer server = getSolrServer(); SolrQuery solrQuery = new SolrQuery(). setQuery("ipod"). setFacet(true). setFacetMinCount(1). setFacetLimit(8). addFacetField("category"). addFacetField("inStock"); QueryResponse rsp = server.query(solrQuery);
所有的 setter/add 方法都是返回它自己本身的實例,所以就像你所看到的一樣,上面的用法是鏈式的