solrj5.5.4简单封装的工具类

本人在使用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);
}
}


转载于:https://my.oschina.net/songyou/blog/1544294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值