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


分享到:


相關文章: