solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库。
一、认识solrj
solrj是solr的java客户端,用于访问solr索引库。它提供了添加、删除、查询、优化等功能。
二、下载
百度、google以下solrj下载,你会发现根本就没有,那么我们该到哪儿下载呢?其实,它是集成到solr压缩包里的,解压文件后,有个目录/dist/solrj-lib,里面就存放了solrj所用到的jar,你把这些jar都添加到你的classpath就ok。
如果你是使用Maven来构建项目,添加以下代码到你的pom.xml配置文件中:
<dependency> <artifactId>solr-solrj</artifactId> <groupId>org.apache.solr</groupId> <version>1.4.0</version> <type>jar</type> <scope>compile</scope> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.5.6</version> </dependency>
下面是具体使用Solr4j的工具类
package x.y.z; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import my.VirtualProxy; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.FacetField; import org.apache.solr.client.solrj.response.FacetField.Count; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import x.y.z.framework.search.vo.Content; import x.y.z.framework.search.vo.Search; // @Repository & @Autowired is use spring annotations @Repository public class SearchDAOImpl implements SearchDAO { private static Logger logger = Logger.getLogger(SearchDAOImpl. class ); // @Autowired private HttpSolrServer solrServer; @Override public void init() { // TODO Auto-generated method stub String SearchService_Url = "http://localhost:8983/solr" ; this .solrServer = new HttpSolrServer(SearchService_Url); try { solrServer.ping(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void init(String url) { // TODO Auto-generated method stub this .solrServer = new HttpSolrServer(url); try { solrServer.ping(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public boolean ping() { // TODO Auto-generated method stub try { if ( this .solrServer != null ) { this .solrServer.ping(); return true ; } else { logger.debug( "Manipulate null object.SolrServer must init." ); return false ; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return false ; } } @Override public void addIndex(Content add) { // TODO Auto-generated method stub } @Override public void deleteIndex(Content delete) { // TODO Auto-generated method stub } @Override public void changeIndex(Content old_index, Content new_index) { // TODO Auto-generated method stub } @Override public Search query(String query, int start, int rows,String SortField, boolean Highlight) { // TODO Auto-generated method stub if ( this .solrServer != null ) { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(query); // start the query and show the rows number solrQuery.setStart(start); solrQuery.setRows(rows); // Sequence // Sequence for the asscet time and Weights for the sort result // the seq must not a null value solrQuery.addSortField(SortField, SolrQuery.ORDER.asc); // high light solrQuery.setHighlight( true ); solrQuery.addHighlightField( "name" ); solrQuery.addHighlightField( "id" ); solrQuery.addHighlightField( "title" ); solrQuery.addHighlightField( "features" ); solrQuery.addHighlightField( "content" ); solrQuery.setHighlightSimplePre( "<font color='red'>" ); solrQuery.setHighlightSimplePost( "</font>" ); solrQuery.setHighlightSnippets( 1); // 结果分片数,默认为1 solrQuery.setHighlightFragsize(1000); // 每个分片的最大长度,默认为100 solrQuery.setFacet( true ).setFacetMinCount(1).setFacetLimit(5).addFacetField("id").addFacetField("inStock" ); solrQuery.setFacet( true ).setFacetMinCount(1).setFacetLimit(5).addFacetField("content").addFacetField("inStock" ); QueryResponse queryResponse = null ; try { queryResponse = solrServer.query(solrQuery); SolrDocumentList solrDocumentList = queryResponse.getResults(); return new Search(queryResponse,solrDocumentList); } catch (SolrServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { logger.debug( "The Search Server is null value." ); } return null ; } @Override public void close() { // TODO Auto-generated method stub if ( this .solrServer != null ) { this .solrServer.shutdown(); } else { logger.debug( "Manipulate null object.SolrServer must init." ); } } @Override public List<Content> queryAll() { // TODO Auto-generated method stub List<Content> list = new ArrayList<Content> (); if ( this .solrServer != null ) { SolrQuery solrQuery = new SolrQuery(); // String query = "GB"; String query = "*:*" ; solrQuery.setQuery(query); // add the Integer start = 0 ; Integer rows = 20 ; solrQuery.setStart(start); solrQuery.setRows(rows); // Sequence // Sequence for the asscet time and Weights for the sort result // the seq must not a null value // solrQuery.addSortField("name", SolrQuery.ORDER.asc); solrQuery.addSortField("id" , SolrQuery.ORDER.asc); // high light solrQuery.setHighlight( true ); solrQuery.addHighlightField( "name" ); solrQuery.addHighlightField( "id" ); solrQuery.addHighlightField( "title" ); solrQuery.addHighlightField( "features" ); solrQuery.addHighlightField( "content" ); solrQuery.setParam( "hl.fl", "content" ); solrQuery.setHighlightSimplePre( "<font color=\"red\">" ); solrQuery.setHighlightSimplePost( "</font>" ); solrQuery.setFacet( true ).setFacetMinCount(1).setFacetLimit(5).addFacetField("id" ); solrQuery.setFacet( true ).setFacetMinCount(1).setFacetLimit(5).addFacetField("content" ); solrQuery.setFacet( true ).setFacetMinCount(1).setFacetLimit(5).addFacetField("features" ); try { QueryResponse queryResponse = solrServer.query(solrQuery); SolrDocumentList docs = queryResponse.getResults(); System.out.println( "doc number found :" + docs.getNumFound()); System.out.println( "doc max score :" + docs.getMaxScore()); for (SolrDocument doc : docs) { String name = (String) doc.getFieldValue("name" ); String id = (String) doc.getFieldValue("id" ); ArrayList features = (ArrayList)doc.getFieldValue("features" ); // to add the list value must use the temp object Content vo = new Content(); // Set the vo object vo.setId(id); vo.setName(name); vo.setFeatures(features); list.add(vo); // Print the list value System.out.println("id :" + id); System.out.println( "name :" + name); if (features != null ) { for (Object feature : features.toArray()) { System.out.println( "feature :" + feature.toString()); } } } } catch (SolrServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { logger.debug( "The Search Server is null value." ); } return list; } @Override public int queryTotal(String query) { // TODO Auto-generated method stub if ( this .solrServer != null ) { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(query); QueryResponse queryResponse; try { queryResponse = solrServer.query(solrQuery); return queryResponse.getResults().size(); } catch (SolrServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 0 ; } /* * (non-Javadoc) * @Warning it will clear ALL the index * @see com.cfp.framework.search.dao.SearchDAO#clearAll() */ @Override public void clearAll() { // TODO Auto-generated method stub try { solrServer.deleteByQuery( "*:*" ); solrServer.commit(); } catch (SolrServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }