Solr操作的java工具类

* solr客户端操作基类,可以使用两种方式进行操作索引,第一种用普通javaBean,第二种使用有固定的solr注解字段javaBean

* javaBean操作的字段必须在solr服务器定义,否则会报错

*

*/

public class SolrBase {

private static String solrURL = "http://localhost:8983/solr";

private static Logger log = Logger.getLogger(SolrBase.class);

static {

solrURL = SystemConfig.getDefaultConfig("solr.server.url");

}

private static HttpSolrServer solrServer = null;

/**

* 单个索引添加或更新,修改时是按照Id进行覆盖的

* @param indexMap

*/

public void addIndex(Map indexMap){

if(indexMap ==null && indexMap.size()==0){

log.error("索引参数为空,请检查");

return;

}

try {

/**1、创建solrServer(HttpSolrServer和EmbeddedSolrServer)

* 其中HttpSolrServer必须依赖tomcat等WEB容器,EmbeddedSolrServer则不需要,但是需要

* 引入其它jar包,具体可以参照doc下得solr wiki.html

* **/

HttpSolrServer server = getSolrServer();

//server.deleteByQuery("*:*");//先删除默认数据,防止对理解产生混淆

/**2、solr要求doc的Field中必须存在一个Field为id,并且值为java.lang.String类型

* 并且要保证Id的唯一,否则最后添加的相同Id的域会覆盖前面的域,也就等于是更新

* **/

String id = UUID.randomUUID().toString();

SolrInputDocument doc = new SolrInputDocument();

if(indexMap.get("id") !=null){

id = (String)indexMap.get("id");

}

doc.addField("id",id);

/**3、对于需要使用doc添加的Field,必须先在schema.xml中进行配置,然后才可以使用,

* 关于schema的配置说明,可以参照lucene-solr.txt中得说明

* **/

Iterator iter = indexMap.keySet().iterator();

for(;iter.hasNext();){

String key = iter.next();

doc.addField(key, indexMap.get(key));

}

server.add(doc);

server.commit();//提交,将所有更新提交到索引中

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//solrServer是线程安全的,所以在使用时需要使用单例的模式,减少资源的消耗

public static HttpSolrServer getSolrServer(){

if(solrServer==null){

solrServer = new HttpSolrServer(solrURL);

}

return solrServer;

}

/**多个索引添加,对象字段必须用solr注解

* 使用POJO添加document

*/

public static void addIndexByList(List> objList){

try {

HttpSolrServer server = getSolrServer();

server.addBeans(objList);

server.commit();

log.info("提交成功");

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**添加或修改记录,按通用字段

* 修改时是按照Id进行覆盖的

* **/

public static void addIndexByCommBean(Message msg){

try {

HttpSolrServer server = getSolrServer();

if(StringUtils.isEmpty(msg.getId())){

msg.setId(UUID.randomUUID().toString());

}

server.addBean(msg);

server.commit();

} catch (IOException e) {

e.printStackTrace();

} catch (SolrServerException e) {

e.printStackTrace();

}

}

/**

* 查询

*/

public static void query(String q){

try {

HttpSolrServer server = getSolrServer();

//String q = "text:中";//q表示查询的内容

SolrQuery query = new SolrQuery(q);

/*query.setStart(0)

.setRows(3);//进行分页查询

query.setHighlight(true).setHighlightSimplePre("")

.setHighlightSimplePost("");//高亮

//只有将内容存储后才能进行展示,比如title_content查询结果就为空

query.setParam("hl.fl", "title,content");*/

QueryResponse resp = server.query(query);

SolrDocumentList sdList = resp.getResults();

long totalResults = sdList.getNumFound();//命中的总记录数

log.info("totalResults-->"+totalResults);

for(SolrDocument sd:sdList){

Collection strs = sd.getFieldNames();

log.info(sd.getFieldValue("title"));

log.info(sd.getFieldValue("content"));

Object id = sd.getFieldValue("id");

if(resp.getHighlighting().get(id)!=null){

log.info("高亮的结果-->"

+resp.getHighlighting().get(id).get("content"));

}

log.info("-------------------------------");

}

} catch (SolrServerException e) {

e.printStackTrace();

}

}

/**

* 将对象集合添加至索引

* @param lists 自定义转换机制

*/

public static void addConvertBeans(List lists){

try {

HttpSolrServer server = getSolrServer();

server.add(entityList2SolrInputDocument(lists));

server.commit(false, false);

log.info("Add convert object list to index finished. ");

} catch (Exception e) {

log.error("Add convert object list to index error, " + e.getMessage(), e);

}

}

/**

* 将对象集合添加至索引

* @param lists 自定义转换机制

*/

public static void addConvertBean(Object obj){

try {

HttpSolrServer server = getSolrServer();

server.add(entity2SolrInputDocument(obj));

server.commit(false, false);

log.info("Add convert object to index finished. ");

} catch (Exception e) {

log.error("Add convert object to index error, " + e.getMessage(), e);

}

}

public static

Iterator entityList2SolrInputDocument(List lists){

List list = new ArrayList();

for(T obj : lists){

list.add(entity2SolrInputDocument(obj));

}

return list.iterator();

}

/**

* 实体类与SolrInputDocument转换

* @param obj 实体对象

* @return SolrInputDocument SolrInputDocument对象

*/

public static SolrInputDocument entity2SolrInputDocument(Object obj) {

if (obj != null) {

Class> cls = obj.getClass();

Field[] filedArrays = cls.getDeclaredFields(); //获取类中所有属性

Method m = null;

SolrInputDocument sid = new SolrInputDocument();

for (Field f : filedArrays) {

//因为如果对象序列化之后,会增加该属性,不用对该属性进行反射

if(!f.getName().equals("serialVersionUID")){

try {

Object o = BeanUtils.getFieldValue(obj, f.getName());

/*//第二种方式根据get方法取属性值

* m = BeanUtils.getGetter(cls, f);

//属性名,与对应的属性值 get方法获取到的值

log.info(f.getName() + ":" + m.invoke(obj));*/

log.info(f.getName() + ":" + o);

sid.addField(""+ f.getName(), o);

} catch (Exception e) {

e.printStackTrace();

}

}

}

return sid;

}

log.warn("Object to convert is null.");

return null;

}

/**

* 根据id从索引中删除记录

* @param idName 主键名

* @param id 主键值

*/

public static void deleteById(String idName, Object id){

try {

HttpSolrServer server = getSolrServer();

server.deleteByQuery(idName + ":" + id.toString());

server.commit(false, false);

log.info("Delete from index by id" + id + " finished . operate param is:" + idName + ":" + id.toString());

} catch (Exception e) {

log.error("Delete from index by id" + id + " error, " + e.getMessage(), e);

}

}

/**

* 根据id集合从索引中删除记录

* @param ids

*/

public static void deleteByIds(String idName,List ids){

try {

HttpSolrServer server = getSolrServer();

if (ids.size() > 0) {

StringBuffer query = new StringBuffer(idName + ":" + ids.get(0));

for (int i = 1; i < ids.size(); i++) {

if (null != ids.get(i)) {

query.append(" OR " + idName + ":" + ids.get(i).toString());

}

}

server.deleteByQuery(query.toString());

server.commit(false, false);

log.info("Delete from index by id list" + ids + " finished .");

}else{

log.info("Delete ids list is null.");

}

} catch (Exception e) {

log.error("Delete from index by id list" + ids + " error, " + e.getMessage(), e);

e.printStackTrace();

}

}

/**

* 根据查询从索引中删除

* @param queryString

*/

public static void deleteByQuery(String query){

try {

HttpSolrServer server = getSolrServer();

server.deleteByQuery(query);

server.commit(false, false);

log.info("Delete from index by query string " + query + "finished .");

} catch (Exception e) {

log.error("Delete from index by query Strng " + query + "error, " + e.getMessage(), e);

}

}

/**

* 删除所有索引

*/

public static void deleteAllIndex(){

try {

HttpSolrServer server = getSolrServer();

server.deleteByQuery("*:*");

server.commit(false, false);

log.info("All index delete finished.");

} catch (Exception e) {

log.error("Delete all index error " + e.getMessage(), e);

e.printStackTrace();

}

}

/**

* 根据关键字查询 [使用 solr内部转换机制]

* @param

* @param solrql sql查询串

* @param clzz 对象类型

* @return

*/

public static Page query(String solrql,Page page, Class clzz){

HttpSolrServer server = getSolrServer();

SolrQuery query = new SolrQuery();

query.setQuery(solrql);

query.setStart(page.getStartRow());

query.setRows(page.getPageSize());

QueryResponse response = null;

try {

response = server.query(query);

} catch (SolrServerException e) {

log.error("查询报错:"+e.getMessage());

return null;

}

//查询到的记录总数

int totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();

//查询结果集

List items = response.getBeans(clzz);//转换成带有solr注解字段的bean

page.setTotalRecordsNo(totalRow);

page.setItems(items);

//填充page对象

return page;

}

/**

* 根据关键字查询

* @param solrql

* @param page

* @param hlField

* @param preTag 例如:("");//渲染标签

* @param postTag 例如: ("");//渲染标签

* @param clzz

* @param idName 主键,一般默认为id

* @return

*/

public static Page queryHighter(String solrql,Page page,List hlField,

String preTag,String postTag,Class clzz,String idName){

HttpSolrServer server = getSolrServer();

SolrQuery query = new SolrQuery();

query.setQuery(solrql);

//设置高亮显示

query.setHighlight(true);

//添加高亮域

for(String hlf : hlField){

query.addHighlightField(hlf);

}

//渲染标签

query.setHighlightSimplePre(preTag);

query.setHighlightSimplePost(postTag);

//分页查询

query.setStart(page.getStartRow());

query.setRows(page.getPageSize());

QueryResponse response = null;

try {

response = server.query(query);

} catch (SolrServerException e) {

e.printStackTrace();

return null;

}

//查询到的记录总数

int totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();

//查询结果集

List items = new ArrayList();

//查询结果集

SolrDocumentList solrDocuments = response.getResults();

try {

Object obj = null;

Method m = null;

Class> fieldType = null;

Map>> highlightMap=response.getHighlighting();

for(SolrDocument solrDocument : solrDocuments) {

obj = clzz.newInstance();

Collection fieldNames = solrDocument.getFieldNames(); //得到所有的属性名

for (String fieldName : fieldNames) {

//需要说明的是返回的结果集中的FieldNames()比类属性多

Field[] filedArrays = clzz.getDeclaredFields(); //获取类中所有属性

for (Field f : filedArrays) {

//如果实体属性名和查询返回集中的字段名一致,填充对应的set方法

if(f.getName().equals(fieldName)){

//获取到的属性名

f = clzz.getDeclaredField(fieldName);

//属性类型

fieldType = f.getType();

//获取set方法

m = BeanUtils.getSetter(clzz, f);

//获取fieldType类型

fieldType = getFileType(fieldType);

//获取到的值

// log.info(f.getName() + "-->=" + fieldType.cast(solrDocument.getFieldValue(fieldName)));

//获取到的属性

m.invoke(obj, fieldType.cast(solrDocument.getFieldValue(fieldName)));

for(String hl : hlField){

if(hl.equals(fieldName)){

String idv = solrDocument.getFieldValue(idName).toString();

List hlfList=highlightMap.get(idv).get(fieldName);

if(null!=hlfList && hlfList.size()>0){

//高亮添加

m.invoke(obj, fieldType.cast(hlfList.get(0)));

}else{

//正常添加

m.invoke(obj, fieldType.cast(solrDocument.getFieldValue(fieldName)));

}

}

}

}

}

}

items.add(clzz.cast(obj));

}

} catch (Exception e) {

log.error("highlighter query error." + e.getMessage(), e);

}

page.setTotalRecordsNo(totalRow);

page.setItems(items);

//填充page对象

return page;

}

public static Class> getFileType(Class> fieldType){

// 如果是 int, float等基本类型,则需要转型

if (fieldType.equals(Integer.TYPE)) {

return Integer.class;

} else if (fieldType.equals(Float.TYPE)) {

return Float.class;

} else if (fieldType.equals(Double.TYPE)) {

return Double.class;

} else if (fieldType.equals(Boolean.TYPE)) {

return Boolean.class;

} else if (fieldType.equals(Short.TYPE)) {

return Short.class;

} else if (fieldType.equals(Long.TYPE)) {

return Long.class;

} else if(fieldType.equals(String.class)){

return String.class;

}else if(fieldType.equals(Collection.class)){

return Collection.class;

}else if(fieldType.equals(List.class)){

return List.class;

}

return null;

}

public static void formatPrint(Page page,String solrql,Class clzz){

System.out.println("查询: " + solrql

+ "\t\t页码" + page.getCurrentPage()

+ "/" + page.getTotalPages()

+ ",总共找到" + page.getTotalRecordsNo()+"条符合的记录.\n");

List list = BeanUtils.getDeclaredFields(clzz);

for(Object qz: page.getItems()){

for(Field field : list){

try {

System.out.println(field.getName()+":" + BeanUtils.getFieldValue(qz,field.getName()));

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

public static void main(String[] args){

SolrBase.deleteAllIndex();

/* List msgs = new ArrayList();

for(int i=100006;i<100010;i++){

Message msg = new Message();

msg.setContent("我爱中国,我是中国人"+i);

msg.setId(i+"");

msg.setTitle("我爱中国,我是中国人,我有内容"+i);

msg.setUrl("http://localhost/ab"+i+".html");

msgs.add(msg);

Message msg1 = new Message();

msg1.setContent("广东某工作区内容");

msg1.setId("100012");

msg1.setTitle("广东某工作区内容");

msg1.setUrl("http://localhost/广东.html");

msgs.add(msg1);

}

SolrBase.addIndexByList(msgs);

System.out.print("创建索引成功");*/

/*Page page = new Page();

page.setPageSize(10);

page.setCurrentPage(1);

String solrql = "text:中国";

List hlField = new ArrayList();

hlField.add("title");

hlField.add("content");

SolrBase.queryHighter(solrql, page, hlField, "", "", Message.class, "id");

formatPrint(page,solrql);*/

}

}

---------------------

原文:https://blog.csdn.net/teedry/article/details/52485281


分享到:


相關文章: