本人在使用solr时,简单的对solr常用操作进行了一下封装,特将代码贡献出来,仅供参考,如有问题请指出,项目的完整示例工程请到http://download.csdn.net/download/songyou05/9990205!!
1、solrUtil.java,本类为对solr进行的简单封装类,内容如下:
package com.songy.solr;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
public class SolrUtil {
private static final Logger logs = Logger.getLogger(SolrUtil.class);
//服务器连接
private static HttpSolrClient server;
//配置文件中获取索引服务器的地址
private static String serverUrl="";
static {
Properties properties = new Properties();
try {
InputStream fis = SolrUtil.class.getResourceAsStream("/solr.properties");
properties.load(fis);
String solr_url = properties.getProperty("SOLR_URL");
String solr_core = properties.getProperty("SOLR_CORE");
serverUrl = solr_url+"/"+solr_core;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @Description: 初始化solr连接
* @author songy
* @date 2017年9月19日 下午4:38:14
*/
public static HttpSolrClient getSolrClient(){
if(server == null){
logs.info("初始化solr连接,solr服务器连接地址为:"+serverUrl);
server = new HttpSolrClient(serverUrl);
server.setSoTimeout(3000); // socket read timeout
server.setConnectionTimeout(1000);
server.setDefaultMaxConnectionsPerHost(1000);
server.setMaxTotalConnections(10);
server.setFollowRedirects(false); // defaults to false
server.setAllowCompression(true); // 允许压缩,减少数据量
}
return server;
}
/**
*
* @Description: 创建文件类型索引,需要指定文件路径及文件类型
* contentType 文件类型 word:application/word;pdf:application/pdf
* @author songy
* @date 2017年9月19日 下午4:41:51
*/
public static void addIndexFile(SolrEntry solrEntry){
SolrClient client = getSolrClient();
try {
ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");
logs.info("创建文件solr索引,文件路径为:"+solrEntry.getFilePath());
up.addFile(new File(solrEntry.getFilePath()),solrEntry.getContentType());
up.setParam("literal.id", solrEntry.getId());
//设置生成索引的属性前缀
up.setParam("uprefix", "attr_");
up.setParam("fmap.content", "attr_content");
up.setAction(ACTION.COMMIT, true, true);
client.request(up);
logs.info("创建文件索引信息完成!");
} catch (Exception e) {
logs.error("创建文件索引信息出错,错误信息为:"+e);
} finally{
try {
client.close();
} catch (IOException e) {
logs.error("调用addIndexFile增加索引文件,关闭solr连接时出错,错误信息为:"+e);
}
}
}
/**
*
* @Description: 单个、批量新增或更新solr索引信息
* @author songy
* @date 2017年9月20日 上午9:15:03
*/
public static void addIndex(SolrEntry solrEntry,List<SolrEntry> entryList){
SolrClient client = getSolrClient();
try {
if(solrEntry != null && solrEntry.getId() != null){
logs.info("新增或更新solr索引信息,索引id为:"+solrEntry.getId());
client.addBean(solrEntry);
client.commit();
}else if(entryList != null && entryList.size()>0){
logs.info("批量新增或更新solr索引信息,记录条数为:"+entryList.size());
client.addBeans(entryList);
client.commit();
}
} catch (Exception e) {
logs.error("新增或更新索引信息出错,错误信息为:"+e);
} finally{
try {
client.close();
} catch (IOException e) {
logs.error("调用addIndex方法新增索引信息,关闭solr连接时出错,错误信息为:"+e);
}
}
}
/**
*
* @Description: 更新solr中的索引信息
* @author songy
* @date 2017年9月20日 上午9:07:22
*/
public static void updateIndex(SolrEntry solrEntry,List<SolrEntry> entryList){
if(solrEntry != null && solrEntry.getId() != null){
logs.info("开始调用updateIndex方法,更新单条记录索引信息");
addIndex(solrEntry,entryList);
}else if(entryList != null && entryList.size() >0){
logs.info("开始调用updateIndex方法,批量更新索引信息");
addIndex(solrEntry,entryList);
}
}
/**
*
* @Description: 单条、批量删除索引
* @author songy
* @date 2017年9月19日 下午5:02:08
* @param SolrEntry 索引实体对象
*/
public static void delteIndexById(SolrEntry solrEntry,List<String> ids){
SolrClient client = getSolrClient();
try {
if(solrEntry != null && solrEntry.getId() != null){
logs.info("根据id删除索引信息,id为:"+solrEntry.getId());
client.deleteById(solrEntry.getId());
client.commit();
}else if(ids != null && ids.size()>0){
logs.info("根据id集合批量删除索引信息,id集合为:"+ids);
client.deleteById(ids);
client.commit();
}
} catch (Exception e) {
logs.error("根据id删除索引信息出错,错误信息为:"+e);
} finally{
try {
client.close();
} catch (IOException e) {
logs.error("调用delteIndexById删除索引信息,关闭solr连接时出错,错误信息为:"+e);
}
}
}
/**
*
* @Description: 按查询出的结果情况索引信息,如果清空所有索引,则content值为*:*。
* @author songy
* @date 2017年9月19日 下午4:59:26
*/
public static void deleteIndexByQuery(SolrEntry solrEntry){
SolrClient client = getSolrClient();
try {
if(solrEntry != null && solrEntry.getContent() != null){
logs.info("按查询删除索引信息,查询条件为:"+solrEntry.getContent());
client.deleteByQuery(solrEntry.getContent());
client.commit();
}
} catch (Exception e) {
logs.error("按查询删除索引信息出错,错误信息为:"+e);
}finally{
try {
client.close();
} catch (IOException e) {
logs.error("调用deleteIndexByQuery删除索引信息,关闭solr连接时出错,错误信息为:"+e);
}
}
}
/**
*
* @Description: 根据条件查询出内容,并设置该内容高亮显示,返回该内容的摘要部分
* @author songy
* @date 2017年9月21日 下午4:40:32
*/
public static List<String> queryIndex(SolrEntry solrEntry){
SolrClient client = getSolrClient();
List<String> highLightRes = null;
List result = new ArrayList();
if(solrEntry != null && solrEntry.getContent() != null){
SolrQuery query = new SolrQuery();
if(solrEntry != null && solrEntry.getContent() != null){
//设定查询字段
query.setQuery(solrEntry.getContent());
//指定返回结果字段
query.setIncludeScore(true);
//覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。必须大写
query.set("q.op","AND");
//分页开始页数
query.setStart(solrEntry.getStartPage());
//设定返回记录数,默认为10条
if(solrEntry.getCountPage() != 0){
query.setRows(solrEntry.getCountPage());
}else{
query.setRows(10);
}
//设定对查询结果是否高亮
query.setHighlight(solrEntry.getHighMark());
// 高亮字段
query.addHighlightField(solrEntry.getHighField());
//高亮摘要长度 默认为50
if(solrEntry.getFragsize() != 0){
query.setHighlightFragsize(5);
}
//高亮结果返回进行分片处理 默认分片数为1
if(solrEntry.getSnippets() != 0){
query.setHighlightSnippets(solrEntry.getSnippets());
}
//设定高亮字段前置标签
query.setHighlightSimplePre("<span style=\"color:red\">");
//设定高亮字段后置标签
query.setHighlightSimplePost("</span>");
QueryResponse response = null;
try {
response = client.query(query);
highLightRes = new ArrayList<String>();
SolrDocumentList docs = response.getResults();
Map<String, Map<String, List<String>>> map = response.getHighlighting();
logs.info("根据条件查询到的文档个数:"+docs.getNumFound()+",查询所用时间为:"+response.getQTime());
for (SolrDocument doc : docs) {
highLightRes = map.get(doc.getFieldValue("id")).get(solrEntry.getHighField());
if(highLightRes != null && highLightRes.size()>0){
result.addAll(highLightRes);
}
logs.info("查询到的高亮内容为:"+highLightRes);
}
} catch (Exception e) {
logs.error("根据条件查询solr索引信息时出错,错误信息为:"+e);
} finally{
try {
client.close();
} catch (IOException e) {
logs.error("调用queryIndex查询索引信息,关闭solr连接时出错,错误信息为:"+e);
}
}
}
}
return highLightRes;
}
}
2、solrEntry类,本类为调用solrUtil时常用的参数封装类,内容如下:
package com.songy.solr;
import org.apache.solr.client.solrj.beans.Field;
public class SolrEntry {
@Field
private String id;//索引唯一键
@Field
private String title;//索引标题
@Field
private String content;//索引内容
private String filePath;//索引文件路径
private String contentType;//索引文件类型
private int startPage;//分页开始记录位置
private int countPage;//返回的总页数
private boolean highMark;//标识是否高亮显示
private String highField;//高亮显示的字段
private int fragsize;//高亮摘要内容长度
private int snippets;//搜索结果分片数
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getCountPage() {
return countPage;
}
public void setCountPage(int countPage) {
this.countPage = countPage;
}
public boolean getHighMark() {
return highMark;
}
public void setHighMark(boolean highMark) {
this.highMark = highMark;
}
public String getHighField() {
return highField;
}
public void setHighField(String highField) {
this.highField = highField;
}
public int getFragsize() {
return fragsize;
}
public void setFragsize(int fragsize) {
this.fragsize = fragsize;
}
public int getSnippets() {
return snippets;
}
public void setSnippets(int snippets) {
this.snippets = snippets;
}
}
3、solr.properties,本文件存放solr的服务地址及索引库的名称,内容如下:
SOLR_URL=http://localhost:8080/solr
SOLR_CORE=core
4、solrStart类,本类为测试类,习惯了java的main方法测试,所以没写junit测试,该测试类,只写了查询方法的测试内容,其它方法的测试内容请自行添加,内容如下:
package com.songy.solr;
import java.util.List;
public class TestStart {
public static void main(String[] args) {
//测试solrutil类
SolrEntry solrEntry = new SolrEntry();
solrEntry.setHighMark(true);
solrEntry.setHighField("attr_content");
solrEntry.setContent("attr_content:正则表达式");
List<String> list = SolrUtil.queryIndex(solrEntry);
System.out.println(list);
}
}