solr java 创建索引_solrj demo 索引创建与查询

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

81531f52668dd96cc700ee475932456a.png

2.创建实体product

这里所有被添加Annotation @Field 注解的属性将参与index操作

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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连接的参数

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

solr.host=http://localhost:8983/solr/core_one

solr.client.timeout=20000solr.connect.timeout=5000max.connections.perhost=100max.total.connection=100

solr.properties

获取配置文件的javabean

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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提交

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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设置查询参数,也可以分页和排序

这里只做一个简单的查询示例

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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,我的测试方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值