solrj作为solr的java客户端使得solr的开发简单了许多,solrJ实际上也是是封装了httpClient方法,来操作solr的API的。
下面来通过一个简单的demo实现solrj的索引创建以及查询
demo需求:需要对一个product 的实体创建以及查询索引(字段包括id,name,keywords,description,sn)
一,首先根据需要在solr配置文件schema.xml中配置相应的field(这边我只需要增加sn字段即可,其他都直接使用了默认存在的field)
二,创建测试项目
1.所需jar包
除了solrj的jar还需要一下jar
2.创建实体product
这里所有被添加Annotation @Field 注解的属性将参与index操作
packagecom.demo.solr.model;importorg.apache.solr.client.solrj.beans.Field;public classProduct {
@FieldprivateString id;
@FieldprivateString name;
@FieldprivateString keywords;
@FieldprivateString description;
@FieldprivateString sn;publicProduct() {super();
}publicProduct(String id, String name, String keywords, String description,
String sn) {super();this.id =id;this.name =name;this.keywords =keywords;this.description =description;this.sn =sn;
}publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getKeywords() {returnkeywords;
}public voidsetKeywords(String keywords) {this.keywords =keywords;
}publicString getDescription() {returndescription;
}public voidsetDescription(String description) {this.description =description;
}publicString getSn() {returnsn;
}public voidsetSn(String sn) {this.sn =sn;
}
}
Product.java
3.添加配置文件,用于创建solr连接的参数
solr.host=http://localhost:8983/solr/core_one
solr.client.timeout=20000solr.connect.timeout=5000max.connections.perhost=100max.total.connection=100
solr.properties
获取配置文件的javabean
packagecom.demo.solr.config;importjava.io.IOException;importjava.io.InputStream;importjava.util.Properties;importorg.apache.commons.lang.StringUtils;importorg.apache.log4j.Logger;public classSolrConfig {private final static Logger logger = Logger.getLogger(SolrConfig.class);public staticString solrHost;public static intsolrConnectTimeout;public static intsolrClientTimeout;public static intmaxConnectionsPerHost;public static intmaxTotalConnection;static{
InputStream is= SolrConfig.class.getResourceAsStream("/solr.properties");if (is != null) {
Properties properties= newProperties();try{
properties.load(is);
}catch(IOException e) {
logger.error(e.getMessage(), e);
e.printStackTrace();
}
solrHost= properties.getProperty("solr.host");
String solrClientTimeoutStr=properties
.getProperty("solr.client.timeout");if(StringUtils.isNotEmpty(solrClientTimeoutStr)) {
solrClientTimeout=Integer.parseInt(solrClientTimeoutStr);
}
String solrConnectTimeoutStr=properties
.getProperty("solr.connect.timeout");if(StringUtils.isNotEmpty(solrConnectTimeoutStr)) {
solrConnectTimeout=Integer.parseInt(solrConnectTimeoutStr);
}
String maxConnectionsPerHostStr=properties
.getProperty("max.connections.perhost");if(StringUtils.isNotEmpty(maxConnectionsPerHostStr)) {
maxConnectionsPerHost=Integer.parseInt(maxConnectionsPerHostStr);
}
String maxTotalConnectionStr=properties
.getProperty("max.total.connection");if(StringUtils.isNotEmpty(maxTotalConnectionStr)) {
maxTotalConnection=Integer.parseInt(maxTotalConnectionStr);
}
}
}
}
SolrConfig.java
4,配置product中自动对应的index name
随便写的 也没用enum
packagecom.demo.solr.config;public interfaceISolrFields {
String ID= "id";
String NAME= "name";
String KEYWORDS= "keywords";
String DESCRIPTION= "description";
String SN= "sn";
}
SolrFields
5,获取solrclient,这里我创建一个工具类来获取SolrClient
packagecom.demo.solr;importorg.apache.solr.client.solrj.impl.HttpSolrClient;importcom.demo.solr.config.SolrConfig;public classSolrClientFactory {private static HttpSolrClient solrClient = null;private static SolrClientFactory solrClientFactory = null;private static String solrHost =SolrConfig.solrHost;private static int solrClientTimeout =SolrConfig.solrClientTimeout;private static int solrConnectTimeout =SolrConfig.solrConnectTimeout;private static int maxConnectionsPerHost =SolrConfig.maxConnectionsPerHost;private static int maxTotalConnection =SolrConfig.maxTotalConnection;privateSolrClientFactory() {
}public synchronizedHttpSolrClient getSolrClient() {if (solrClient == null) {
solrClient= newHttpSolrClient(solrHost);
solrClient.setSoTimeout(solrClientTimeout);//socket read timeout
solrClient.setConnectionTimeout(solrConnectTimeout);
solrClient.setDefaultMaxConnectionsPerHost(maxConnectionsPerHost);
solrClient.setMaxTotalConnections(maxTotalConnection);
solrClient.setFollowRedirects(false); //defaults to false//allowCompression defaults to false.//Server side must support gzip or deflate for this to have any effect.
solrClient.setAllowCompression(true);
}returnsolrClient;
}public static synchronizedSolrClientFactory getInstance() {if (solrClientFactory == null) {
solrClientFactory= newSolrClientFactory();
}returnsolrClientFactory;
}
}
SolrClientFactory
6,创建索引,只需要4步
a.将product转为SolrInputDocument
b.获取solrclient客户端
c.把SolrInputDocument房间solrclient
d.solrclient提交
packagecom.demo.solr;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Collection;importjava.util.List;importorg.apache.log4j.Logger;importorg.apache.solr.client.solrj.SolrServerException;importorg.apache.solr.client.solrj.impl.HttpSolrClient;importorg.apache.solr.common.SolrInputDocument;importcom.demo.solr.config.ISolrFields;importcom.demo.solr.model.Product;public classSolrIndexUtils {private static Logger logger = Logger.getLogger(SolrIndexUtils.class);private final static HttpSolrClient solrClient =SolrClientFactory
.getInstance().getSolrClient();public static void addIndexs( List records) throwsSolrServerException, IOException {int count = 0;
Collection docs = new ArrayList();int size =records.size();for (int i = 0; i < size; i++) {
SolrInputDocument item= newSolrInputDocument();
Product record=records.get(i);
logger.info("Start adding solr index for " +record.toString());
item.addField(ISolrFields.ID, record.getId());
item.addField(ISolrFields.DESCRIPTION,record.getDescription());
item.addField(ISolrFields.KEYWORDS,record.getKeywords());
item.addField(ISolrFields.NAME,record.getName());
item.addField(ISolrFields.SN,record.getSn());
docs.add(item);
count++;if (count % 50 == 0 || count ==size) {
logger.info("Begin commit " + count + " records");
solrClient.add(docs);
solrClient.commit();
docs.clear();
logger.info("End commit " + count + " records");
}
}
}
}
SolrIndexUtils
7,查询索引
solr查询主要依赖SolrQuery,可以通过setQuery设置查询参数,也可以分页和排序
这里只做一个简单的查询示例
packagecom.demo.solr;importjava.io.IOException;importjava.util.List;importorg.apache.commons.lang3.StringUtils;importorg.apache.solr.client.solrj.SolrQuery;importorg.apache.solr.client.solrj.SolrQuery.ORDER;importorg.apache.solr.client.solrj.SolrServerException;importorg.apache.solr.client.solrj.impl.HttpSolrClient;importorg.apache.solr.client.solrj.response.QueryResponse;importcom.demo.solr.model.Product;public classSolrQueryUtils {private final static HttpSolrClient solrClient =SolrClientFactory
.getInstance().getSolrClient();public static Listsearch(String name, String keywords,
String description, String sn,int start, int limit) throwsSolrServerException, IOException{
String searchParam= "";if(StringUtils.isNotEmpty(name)) {if(StringUtils.isNotEmpty(searchParam)) {
searchParam+= " AND name:" +name;
}else{
searchParam+= " name:" +name;
}
}if(StringUtils.isNotEmpty(keywords)) {if(StringUtils.isNotEmpty(searchParam)) {
searchParam+= " AND keywords:" +keywords;
}else{
searchParam+= " keywords:" +keywords;
}
}if(StringUtils.isNotEmpty(description)) {if(StringUtils.isNotEmpty(searchParam)) {
searchParam+= " AND description:" +description;
}else{
searchParam+= " description:" +description;
}
}if(StringUtils.isNotEmpty(sn)) {if(StringUtils.isNotEmpty(searchParam)) {
searchParam+= " AND sn:" +sn;
}else{
searchParam+= " sn:" +sn;
}
}if (!StringUtils.isNotEmpty(searchParam)) {
searchParam= "*:*";
}
SolrQuery sQuery= newSolrQuery();
sQuery.setQuery(searchParam);
sQuery.setStart(start);
sQuery.setRows(limit);
sQuery.addSort("sn", ORDER.desc);
QueryResponse qrsp=solrClient.query(sQuery);
List products = qrsp.getBeans(Product.class);returnproducts;
}
}
SolrQueryUtils
8,我的测试方法
packagecom.demo.solr;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.Random;importjava.util.UUID;importorg.apache.lucene.queryparser.classic.ParseException;importorg.apache.solr.client.solrj.SolrServerException;importcom.demo.solr.model.Product;public classStartup {public static void main(String[] args) throwsIOException, ParseException, SolrServerException {
System.out.println(newDate());
testSearch();
System.out.println(newDate());
}public static void testInsert() throwsIOException, SolrServerException{
List products =new ArrayList();
Random ran= newRandom();
File dataFile=new File("E://data.txt");
FileWriter fileWriter=newFileWriter(dataFile);
BufferedWriter bw=newBufferedWriter(fileWriter);for(int i=0;i<100;i++){
String id=UUID.randomUUID().toString();
String name="test"+i+ran.nextInt(5000);
String sn="sn-"+333;
String keywords="just test-"+UUID.randomUUID().toString().replace("-", "");
products.add(new Product(id, name, keywords, null, sn));
bw.write(id);
bw.write("\t");
bw.write(name);
bw.write("\t");
bw.write(keywords);
bw.write("\t");
bw.write(sn);
bw.newLine();
}
fileWriter.flush();
bw.close();
fileWriter.close();
System.out.println(products.size());
SolrIndexUtils.addIndexs(products);
}public static void testSearch() throwsSolrServerException, IOException{
List search = SolrQueryUtils.search("test2833", null, null, null, 0, 20);for(Product product : search) {
System.out.println(product.getId()+"||||||"+product.getName());
}
}
}
Startup
你也可以通过这里查看wiki上的实例,不过貌似是老版本了通过SolrServer创建客户端的方式在新版本中已经不推荐,而使用改为SolrClient了