Solr创建索引源码解析(2)

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方法 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/64d95134413939bb0ecdb114e34209ce.html