利用solr构建企业搜索平台(五)

相信很多人,在准备提交数据让solr建立索引的那刻,很纳闷,尽管看了不少网上的一些文章,但是我想依然还是有不少不理解的地方。
比如提交一个xml,采用post方式,尽管有些文章说了可以采用httpclient。但是我那个时候,还不是很理解,当然现在看来其实也没有什么了。但是对于一个刚入门solr的初学者,我想讲讲关于solr1.3的 solrj( sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。)!

先上一个例子:

Java代码 复制代码
  1. public static final String SOLR_URL = "http://localhost/solr/core0";   
  2. public static void commit() {   
  3.     Date date = new Date();   
  4.     SolrServer solr = null;   
  5.     try {   
  6.         solr = new CommonsHttpSolrServer(SOLR_URL);   
  7.     } catch (MalformedURLException e1) {   
  8.         e1.printStackTrace();   
  9.     }   
  10. for (int i = 0; i < 10000; i++) {   
  11.             SolrInputDocument sid = new SolrInputDocument();   
  12.             sid.addField("id", i);   
  13.             sid.addField("name""struts+hibernate+spring 开发大全" + i);   
  14.             sid.addField("summary""三种框架的综合应用" + i);   
  15.             sid.addField("author""李良杰" + i);   
  16.             sid.addField("date"new Date());   
  17.             sid.addField("content""高级应用类书籍" + i);   
  18.             sid.addField("keywords""SSH" + i);   
  19.             try {   
  20.                 solr.add(sid);   
  21.             } catch (MalformedURLException e) {   
  22.                 e.printStackTrace();   
  23.             } catch (SolrServerException e) {   
  24.                 e.printStackTrace();   
  25.             } catch (IOException e) {   
  26.                 e.printStackTrace();   
  27.             }   
  28.             System.out.println(i);   
  29.             if (i == 999)    
  30.                 System.out.println((new Date().getTime() - date.getTime()) / 60000 + "分钟");   
  31.         }   
  32.         try {   
  33.             solr.commit();   
  34.         } catch (SolrServerException e) {   
  35.             e.printStackTrace();   
  36.         } catch (IOException e) {   
  37.             e.printStackTrace();   
  38.         }   
  39. }  
public static final String SOLR_URL = "http://localhost/solr/core0";
public static void commit() {
	Date date = new Date();
	SolrServer solr = null;
	try {
		solr = new CommonsHttpSolrServer(SOLR_URL);
	} catch (MalformedURLException e1) {
		e1.printStackTrace();
	}
for (int i = 0; i < 10000; i++) {
			SolrInputDocument sid = new SolrInputDocument();
			sid.addField("id", i);
			sid.addField("name", "struts+hibernate+spring 开发大全" + i);
			sid.addField("summary", "三种框架的综合应用" + i);
			sid.addField("author", "李良杰" + i);
			sid.addField("date", new Date());
			sid.addField("content", "高级应用类书籍" + i);
			sid.addField("keywords", "SSH" + i);
			try {
				solr.add(sid);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (SolrServerException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			System.out.println(i);
			if (i == 999) 
				System.out.println((new Date().getTime() - date.getTime()) / 60000 + "分钟");
		}
		try {
			solr.commit();
		} catch (SolrServerException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
}



上面这段代码的意思是:利用for提交10000个document,并打印提交10000所需的时间。
1》CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。

2》CommonsHttpSorlrServer 允许设置链接属性。

Java代码 复制代码
  1. server.setSoTimeout(1000);  // socket read timeout     
  2.   server.setConnectionTimeout(100);     
  3.   server.setDefaultMaxConnectionsPerHost(100);     
  4.   server.setMaxTotalConnections(100);     
  5.   server.setFollowRedirects(false);  // defaults to false     
  6.   // allowCompression defaults to false.     
  7.   // Server side must support gzip or deflate for this to have any effect.     
  8.   server.setAllowCompression(true);     
  9.   server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.  
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.

 

3》实现SolrServer接口的另一个类:EmbeddedSorrServer,它不需要http连接。

4》在构造document的时候,可以一个一个添加到solrServer,也可以构建一个包含document的Collection,将Collection添加到solrServer,然后commit。

5》也可以构造一个跟document匹配的JavaBean进行提交
      使用 java 注释创建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一个域的名称跟bean的名称是不一样的,那么在java注释中填写别名,具体的,可以参照下面的域categories         

Java代码 复制代码
  1. import org.apache.solr.client.solrj.beans.Field;     
  2.  public class Item {     
  3.     @Field     
  4.     String id;     
  5.     @Field("cat")     
  6.     String[] categories;      
  7.     @Field     
  8.     List<String> features;      
  9.   }    
import org.apache.solr.client.solrj.beans.Field;  
 public class Item {  
    @Field  
    String id;  
    @Field("cat")  
    String[] categories;   
    @Field  
    List<String> features;   
  }  


java注释也可以使用在setter方法上,如下面的例子:

Java代码 复制代码
  1. @Field("cat")     
  2.  public void setCategory(String[] c){     
  3.      this.categories = c;     
  4.  }  
@Field("cat")  
 public void setCategory(String[] c){  
     this.categories = c;  
 }

 
这里应该要有一个相对的,get方法(没有加java注释的)来读取属性

Java代码 复制代码
  1. Item item = new Item();     
  2. item.id = "one";     
  3. item.categories =  new String[] { "aaa""bbb""ccc" };   
Item item = new Item();  
item.id = "one";  
item.categories =  new String[] { "aaa", "bbb", "ccc" }; 


添加给solr         

Java代码 复制代码
  1. server.addBean(item);  
server.addBean(item);

 
将多个bean提交给solr

Java代码 复制代码
  1. List<Item> beans ;     
  2. //add Item objects to the list     
  3. server.addBeans(beans);  
List<Item> beans ;  
//add Item objects to the list  
server.addBeans(beans);

    
注意: 你可以重复使用SolrServer,这样可以提高性能。

6》

Java代码 复制代码
  1. public static void update() {   
  2.     SolrServer solrServer = null;   
  3.     try {   
  4.         solrServer = new CommonsHttpSolrServer(SOLR_URL);   
  5.     } catch (MalformedURLException e) {   
  6.         e.printStackTrace();   
  7.     }   
  8.     UpdateRequest updateRequest = new UpdateRequest();   
  9.     SolrInputDocument sid = new SolrInputDocument();   
  10.     sid.addField("id"100000);   
  11.     sid.addField("name""struts+hibernate+spring 开发大全");   
  12.     sid.addField("summary""三种框架的综合应用");   
  13.     sid.addField("author""李良杰");   
  14.     sid.addField("date"new Date());   
  15.     sid.addField("content""高级应用类书籍");   
  16.     sid.addField("keywords""SSH");   
  17.     updateRequest.setAction(UpdateRequest.ACTION.COMMIT, falsefalse);     
  18.     updateRequest.add(sid);     
  19.     try {   
  20.         UpdateResponse updateResponse = updateRequest.process(solrServer);   
  21.         System.out.println(updateResponse.getStatus());   
  22.     } catch (SolrServerException e) {   
  23.         e.printStackTrace();   
  24.     } catch (IOException e) {   
  25.         e.printStackTrace();   
  26.     }   
  27. }  
public static void update() {
	SolrServer solrServer = null;
	try {
		solrServer = new CommonsHttpSolrServer(SOLR_URL);
	} catch (MalformedURLException e) {
		e.printStackTrace();
	}
	UpdateRequest updateRequest = new UpdateRequest();
	SolrInputDocument sid = new SolrInputDocument();
	sid.addField("id", 100000);
	sid.addField("name", "struts+hibernate+spring 开发大全");
	sid.addField("summary", "三种框架的综合应用");
	sid.addField("author", "李良杰");
	sid.addField("date", new Date());
	sid.addField("content", "高级应用类书籍");
	sid.addField("keywords", "SSH");
	updateRequest.setAction(UpdateRequest.ACTION.COMMIT, false, false);  
	updateRequest.add(sid);  
	try {
		UpdateResponse updateResponse = updateRequest.process(solrServer);
		System.out.println(updateResponse.getStatus());
	} catch (SolrServerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}


提交一个document,采用更新方式,注意:

Java代码 复制代码
  1. updateRequest.setAction(UpdateRequest.ACTION.COMMIT, falsefalse);  
updateRequest.setAction(UpdateRequest.ACTION.COMMIT, false, false);



7》

Java代码 复制代码
  1. public static void query() {   
  2.     SolrServer solr = null;   
  3.     try {   
  4.         solr = new CommonsHttpSolrServer(SOLR_URL);   
  5.     } catch (MalformedURLException e) {   
  6.         e.printStackTrace();   
  7.         return;   
  8.     }   
  9.     // http://localhost:8983/solr/spellCheckCompRH?q=epod&spellcheck=on&spellcheck.build=true   
  10.     ModifiableSolrParams params = new ModifiableSolrParams();   
  11.     params.set("qt""/spellCheckCompRH");   
  12.     params.set("q""编程");   
  13.     params.set("spellcheck""on");   
  14.     params.set("spellcheck.build""true");   
  15.     QueryResponse response = null;   
  16.     try {   
  17.         response = solr.query(params);   
  18.     } catch (SolrServerException e) {   
  19.         e.printStackTrace();   
  20.         return;   
  21.     }   
  22.     System.out.println("response = " + response);   
  23. }  
public static void query() {
	SolrServer solr = null;
	try {
		solr = new CommonsHttpSolrServer(SOLR_URL);
	} catch (MalformedURLException e) {
		e.printStackTrace();
		return;
	}
	// http://localhost:8983/solr/spellCheckCompRH?q=epod&spellcheck=on&spellcheck.build=true
	ModifiableSolrParams params = new ModifiableSolrParams();
	params.set("qt", "/spellCheckCompRH");
	params.set("q", "编程");
	params.set("spellcheck", "on");
	params.set("spellcheck.build", "true");
	QueryResponse response = null;
	try {
		response = solr.query(params);
	} catch (SolrServerException e) {
		e.printStackTrace();
		return;
	}
	System.out.println("response = " + response);
}


这是一个查询方法。关键字:“编程”。关于查询的关键字,请参见slor wiki http://wiki.apache.org/solr/QueryParametersIndex或等待我的博客更新,在后面会有篇文章详细讲这个问题!

8》给solr的索引文件手动进行优化,

Java代码 复制代码
  1. solr.optimize();  
solr.optimize();



9》solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。
Java代码

Java代码 复制代码
  1. SolrServer server = getSolrServer();     
  2. SolrQuery solrQuery = new  SolrQuery().setQuery("ipod").setFacet(true).setFacetMinCount(1).setFacetLimit(8).      addFacetField("category").addFacetField("inStock");       
  3. QueryResponse rsp = server.query(solrQuery);  
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 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。

你可能感兴趣的:(java,spring,ssh,企业应用,Solr)