* 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
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
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
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
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
List
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
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
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
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
String preTag,String postTag,Class
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
//查詢結果集
SolrDocumentList solrDocuments = response.getResults();
try {
Object obj = null;
Method m = null;
Class> fieldType = null;
Map
for(SolrDocument solrDocument : solrDocuments) {
obj = clzz.newInstance();
Collection
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
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
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
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.add("title");
hlField.add("content");
SolrBase.queryHighter(solrql, page, hlField, "", "", Message.class, "id");
formatPrint(page,solrql);*/
}
}
---------------------
原文:https://blog.csdn.net/teedry/article/details/52485281
閱讀更多 碼農宸娛樂淇 的文章