3.下面来说明下SolrUtil类,此类主要是封装了CommonHttpSolrServer
import Java.util.Collection;
import log.CommonLogger;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
public class SolrUtil {
public CommonsHttpSolrServer server = null;
public String url = "";//url为solr服务的地址
public String shards = "";
public SolrUtil(String url) {
this.url = url;
initSolr();
}
public SolrUtil(String url,String shards) {
this.url = url;
this.shards=shards;
initSolr();
}
//初始化Server
private void initSolr() {
try {
server = new CommonsHttpSolrServer(url);
server.setSoTimeout(60*1000);
server.setConnectionTimeout(60*1000);
server.setDefaultMaxConnectionsPerHost(1000);
server.setMaxTotalConnections(1000);
server.setFollowRedirects(false);
server.setAllowCompression(true);
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
//封装了add、commit
public void addDocList(Collection<SolrInputDocument> docs) {
try {
server.add(docs);
server.commit();
docs.clear();//释放
} catch (Exception e) {
CommonLogger.getLogger().error("addDocList error.", e);
}
}
public void deleteDocByQuery(String query) throws Exception {
try {
server.deleteByQuery(query);
server.commit();
} catch (Exception e) {
CommonLogger.getLogger().error("deleteDocByQuery error.", e);
throw e;
}
}
}
4.现在来看看solr创建索引的源码
其实源码执行的操作无非是 生成请求request 返回response
1.上面代码中的SolrInputDocument 类所做的操作
public class SolrInputDocument implements Map<String,SolrInputField>, Iterable<SolrInputField>, Serializable //实现了Map和Iterable的接口并且实现了接口中的方法,其主要的类为SolrInputFiled类
public class SolrInputField implements Iterable<Object>, Serializable //类中只有三个属性,String key,Object value,还包括评分 float boost = 1.0f; 默认是1.0f(如果做权重的话可以设置这个值)
再来看下执行的CommonHttpSolrServer类所做的操作(表现形式在SolrUtil中的addDocList)
2.添加文档方法
public UpdateResponse add(Collection<SolrInputDocument> docs ) throws SolrServerException, IOException {UpdateRequest req = new UpdateRequest();//创建一个request
req.add(docs);//调用UpdateRequest的add方法,添加索引文档
return req.process(this);//亲 重点是这个方法(返回的是response)
}
//再看下UpdateRequest的add方法
private List<SolrInputDocument> documents = null;
public UpdateRequest add( final Collection<SolrInputDocument> docs )
{
if( documents == null ) {
documents = new ArrayList<SolrInputDocument>( docs.size()+1 );
}
documents.addAll( docs );
return this;
}
3.提交方法 commit,调用的是SolrServer类中的
public UpdateResponse commit( boolean waitFlush, boolean waitSearcher ) throws Solr ServerException, IOException {
return new UpdateRequest().setAction( UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher ).process( this );//看到了吗?
setAction都是为了对对象ModifiableSolrParams(这个对象在最终CommonHttpSolrServerrequest的request方法中用的到)
在提交索引的时候也是调用的process方法
}