package com.chengshu.logger.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import com.infomorrow.model.logger.Collect;
public class SolrCollect {
private static String tomcat_solr = "http://bd-kafak202-34:8983/solr/collectdata_shard3_replica1";
private static HttpSolrServer solr = null;
// 初始化solr服务
public static void initialize() {
try {
solr = new HttpSolrServer(tomcat_solr);
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
solr.setAllowCompression(true);
} catch (Exception e) {
System.out.println("请检查tomcat服务器或端口是否开启!");
e.printStackTrace();
}
}
// 检测collect是否有字段为空
public static Boolean CheckGood(Collect collect) {
if (null == collect.getCrawl_token()) {
return false;
} else if (null == collect.getCreate_time()) {
return false;
} else if (null == collect.getDb_save_time()) {
return false;
} else if (null == collect.getIP()) {
return false;
} else if (null == collect.getLevel()) {
return false;
} else if (null == collect.getMessage()) {
return false;
} else if (null == collect.getNote()) {
return false;
} else if (null == collect.getSender()) {
return false;
} else if (null == collect.getStack_trace()) {
return false;
} else if (null == collect.getWebsite()) {
return false;
} else {
return true;
}
}
// 将数据库中的时间转换为solr可接受的格式
public static String Convertime(String time) {
time = time.replace(" ", "T");
time = time + "00Z";
return time;
}
// 添加记录
public static void addCollect(Collect collect) {
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
if (CheckGood(collect)) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("_id", UUID.randomUUID().toString());
doc.addField("crawl_token", collect.getCrawl_token());
doc.addField("level", collect.getLevel());
doc.addField("create_time", collect.getCreate_time());
doc.addField("message", collect.getMessage());
doc.addField("website", collect.getWebsite());
doc.addField("sender", collect.getSender());
doc.addField("stack_trace", collect.getStack_trace());
doc.addField("note", collect.getNote());
doc.addField("ip", collect.getIP());
doc.addField("db_save_time", collect.getDb_save_time());
docs.add(doc);
}
try {
// solr.add(docs);
// solr.optimize();
// solr.commit();
UpdateRequest req = new UpdateRequest();
req.setAction(UpdateRequest.ACTION.COMMIT, false, false);
req.add(docs);
UpdateResponse rsp = req.process(solr);
System.out.println(rsp.getStatus());
} catch (Exception e) {
e.printStackTrace();
}
}
// 添加beans到索引
public static void addGoodsBeans(List<Collect> beansList) {
try {
solr.addBeans(beansList);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 删除所有索引
public static void DeleteAllIndex() {
try {
solr.deleteByQuery("_id:1*");
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据ID删除索引
public static void DeleteIndex(List<String> ids) {
try {
solr.deleteById(ids);
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
// 进行搜索,
// field、key为查询(值或范围均可),
// start为起始查询位置,row为返回结果个数,
// sortfield为排序字段,
// flag中true升序、false降序,
// hightlight选择是否高亮返回,高亮字段为title
public static QueryResponse Search(String[] field, String[] key, int start, int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
if (null == field || null == key || field.length != key.length) {
return null;
}
if (null == sortfield || null == flag || sortfield.length != flag.length) {
return null;
}
SolrQuery query = null;
try {
for (int i = 0; i < field.length; i++) {
if (query == null) {
query = new SolrQuery(field[i] + ":" + key[i]);
} else {
query.addFilterQuery(field[i] + ":" + key[i]);
}
}
query.setStart(start);
query.setRows(count);
for (int i = 0; i < sortfield.length; i++) {
if (flag[i]) {
query.addSort(sortfield[i], SolrQuery.ORDER.asc);
} else {
query.addSort(sortfield[i], SolrQuery.ORDER.desc);
}
}
if (null != hightlight) {
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("crawl_token");// 高亮字段
query.setHighlightSimplePre("<font color=\"red\">");// 标记
query.setHighlightSimplePost("</font>");
query.setHighlightSnippets(1);
query.setHighlightFragsize(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(query.toString());
QueryResponse rsp = null;
try {
rsp = solr.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return rsp;
}
// 自动补全
public static String[] autoComplete(String prefix, int min) {
String words[] = null;
StringBuffer sb = new StringBuffer("");
SolrQuery query = new SolrQuery("*.*");
QueryResponse rsp = new QueryResponse();
try {
query.setFacet(true);
query.setQuery("*:*");
query.setFacetPrefix(prefix);
query.addFacetField("crawl_token");
rsp = solr.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
if (null != rsp) {
FacetField ff = rsp.getFacetField("crawl_token");
List<Count> countList = ff.getValues();
if (null == countList) {
return null;
}
for (int i = 0; i < countList.size(); i++) {
String tmp[] = countList.get(i).toString().split(" ");
if (tmp[0].length() < 2) {
continue;
}
sb.append(tmp[0] + " ");
min--;
if (min == 0) {
break;
}
}
words = sb.toString().split(" ");
} else {
return null;
}
return words;
}
public static void main(String[] args) {
initialize();
// 添加索引
// Collect collect = new Collect();
// collect.setCrawl_token("me_aa");
// collect.setCreate_time(System.currentTimeMillis());
// collect.setDb_save_time(System.currentTimeMillis());
// collect.setIP("127.0.0.1");
// collect.setLevel("Info");
// collect.setMessage("message");
// collect.setNote("note");
// collect.setSender("APP");
// collect.setStack_trace("exception ....");
// collect.setWebsite("chinamobile");
// addCollect(collect);
// 删除索引
// DeleteAllIndex();
// 查询索引
String[] field = { "crawl_token", "level" };
String[] key = { "*", "*" };
int start = 0;
int count = 15;
String[] sortfield = { "create_time" };
Boolean flag[] = { false };
Boolean hightlight = true;
QueryResponse res = Search(field, key, start, count, sortfield, flag, hightlight);
SolrDocumentList list = res.getResults();
for(int i=0;i<list.size();i++){
SolrDocument document = list.get(i);
String token = (String)document.getFieldValue("crawl_token");
String level = (String)document.getFieldValue("level");
System.out.println(token+" "+level);
}
// 自动补全
String words[] = autoComplete("me", 10);
if (null != words) {
System.out.println(words.length);
for (int i = 0; i < words.length; i++) {
System.out.println(words[i]);
}
}
}
}