package com.utstar.iptvboss.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
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.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.FacetParams;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class SolrUtils {
private static final String DEFAULTSCORE = "0.8";
private static SolrUtils singleton;
private Properties prop;
private String zkHost;
private String collection;
private String queryField;
private String queryFieldPinYin;
private String fieldList;
private Integer calPinYinCount;
private CloudSolrClient client;
private final String ZXKEY = "013";
private final String SOLRCOLUMNPREFIX = "SOLR_COLUMN";
private final Integer MINCOUNT = 1;
private final Integer DEFAULTPOINT = 1;
private final Integer INDEX = 6;
private final Integer SECONDS = 3600;
private Logger logger = Logger.getLogger(SolrUtils.class);
private Map<String, String> column = new HashMap<String, String>();
private Map<String, String> columnNameMap = new HashMap<>();
private SolrUtils() {
init();
}
public static SolrUtils getInstance() {
if (singleton == null) {
synchronized (SolrUtils.class) {
if (singleton == null) {
singleton = new SolrUtils();
}
}
}
return singleton;
}
private void init() {
System.out.println("solrUtils initing....");
prop = new Properties();
try {
prop.load(SolrUtils.class.getResourceAsStream("/solr.properties"));
zkHost = prop.getProperty("zkHost");
collection = prop.getProperty("collection");
queryField = prop.getProperty("queryField");
queryFieldPinYin = prop.getProperty("queryFieldPinYin");
fieldList = prop.getProperty("fieldList");
calPinYinCount = Integer.parseInt(prop.getProperty("calPinYinCount","12"));
client = new CloudSolrClient.Builder().withZkHost(zkHost).build();
String mapString = prop.getProperty("columnNameMap");
String[] mapArray = mapString.split(";");
for (String arrayString : mapArray) {
String[] values = arrayString.split(":");
columnNameMap.put(values[0], values[1]);
}
String columnString = prop.getProperty("column");
String[] columnArray = columnString.split(",");
for (String columnMap : columnArray) {
String[] columnTemp = columnMap.split(":");
column.put(columnTemp[0], columnTemp[1]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* by 1022
* @param collection
* @param queryString
* @param start
* @param count
* @return
*/
public JSONObject query2(String collection, String queryString, int start,int count) {
int code = 0;
String message = "成功";
JSONArray array = new JSONArray();
JSONObject json = new JSONObject();
//设置查询集合
client.setDefaultCollection(collection);
//新建查询并设置查询字段
SolrQuery query = new SolrQuery();
query.setQuery(queryString);
//排序
// query.addSort("id", SolrQuery.ORDER.desc);
// query.addSort("id", SolrQuery.ORDER.asc);
//设置起始位置和返回条数
query.setStart(start);
query.setRows(count);
//获取总记录数
long numFound = 0;
try {
long begin1 = System.currentTimeMillis();
//client执行查询
QueryResponse response = client.query(query);
//获取所有文档
long end1 = System.currentTimeMillis();
logger.info("query used time : " + (end1 - begin1));
long begin = System.currentTimeMillis();
SolrDocumentList docs = response.getResults();
numFound = docs.getNumFound();
//封装subject
for (SolrDocument doc : docs) {
Collection<String> fieldNames = doc.getFieldNames();
JSONObject tempJson = new JSONObject();
for (String fieldName :fieldNames) {
Object fieldValue = doc.getFieldValue(fieldName);
tempJson.put(fieldName, fieldValue);
}
array.add(tempJson);
}
} catch (Exception e) {
code = -1;
message = e.toString();
e.printStackTrace();
}
json.put("rows", array);
json.put("total", numFound);
json.put("code", code);
json.put("message", message);
return json;
}
/**
* by 1022
* @param <T>
* @param collection
* @param queryString
* @param start
* @param count
* @return
* @return
* @throws Exception
*/
public <T> T queryById(String collection, String queryString,Class<T> clazz) throws Exception {
T t = null;
//设置查询集合
client.setDefaultCollection(collection);
//创建查询对象
SolrQuery query = new SolrQuery();
//设置查询字符串
query.setQuery(queryString);
//client执行查询
QueryResponse response = client.query(query);
//获取所有文档
SolrDocumentList docs = response.getResults();
//将map转化为bean
if (docs!=null&&docs.size()!=0) {
SolrDocument doc = docs.get(0);
Map<String, Object> map = doc.getFieldValueMap();
HashMap<String, Object> hashMap = new HashMap<String, Object>();
Set<String> set = map.keySet();
for (String string : set) {
if (!"_version_".equals(string)) {
hashMap.put(string, map.get(string));
}
}
t = MapToBeanUtil1.mapToBean(hashMap, clazz);
}
return t;
}
/**
* by 1022
* @param collection
* @param queryString
* @param start
* @param count
* @return
*/
public JSONObject queryById(String collection, String queryString) {
int code = 0;
String message = "成功";
JSONObject json = new JSONObject();
JSONObject jsonUserinfo = new JSONObject();
//设置查询集合
client.setDefaultCollection(collection);
//创建查询对象
SolrQuery query = new SolrQuery();
//设置查询字符串
query.setQuery(queryString);
try {
long begin1 = System.currentTimeMillis();
//client执行查询
QueryResponse response = client.query(query);
//获取所有文档
SolrDocumentList docs = response.getResults();
//封装到jsonUserinfo
if (docs!=null&&docs.size()!=0) {
SolrDocument doc = docs.get(0);
Collection<String> fieldNames = doc.getFieldNames();
for (String fieldName :fieldNames) {
Object fieldValue = doc.getFieldValue(fieldName);
jsonUserinfo.put(fieldName, fieldValue);
}
}
} catch (Exception e) {
code = -1;
message = e.toString();
e.printStackTrace();
}
json.put("vo", jsonUserinfo);
json.put("code", code);
json.put("message", message);
return json;
}
/**
* @param collection 查询的集合
* @param key 查询关键字
* @param column 过滤栏目
* @param start 起始位置
* @param count 返回条数
* @param quetyField 查询的字段
* @return 返回封装好的json
*/
public JSONObject query(String collection, String key, String column, int sdonly, int start,
int count, String quetyField, String bf) {
int code = 0;
String msg = "OK";
String fl = fieldList;
JSONArray array = new JSONArray();
JSONObject json = new JSONObject();
//设置查询集合
client.setDefaultCollection(collection);
//获取栏目列表
// JSONArray columnArray = getColumnType(collection, key, sdonly, start, count, quetyField);
//新建查询并设置查询字段
SolrQuery query = new SolrQuery();
String queryString ="*" + key + "*";
/*if (StringUtils.isNotBlank(column)) {
queryString += " and column:" + column;
}*/
if (StringUtils.isNotBlank(column)) {
query.addFilterQuery("column:" + column);
}
if (sdonly == 1) {
query.addFilterQuery("hdflag:" + 0);
}
query.setQuery(queryString);
query.set("fl", fl);
query.set("df", "searchkey");
query.set("defType","edismax");
query.set("qf",quetyField);
query.set("bf",bf);
//开启facet
/*query.setFacet(true);
query.addFacetField(new String[] {"column"});
query.setFacetMinCount(MINCOUNT);
query.setFacetMissing(false);
query.setFacetSort(FacetParams.FACET_SORT_INDEX_LEGACY);*/
//排序
query.addSort("score", SolrQuery.ORDER.desc);
query.addSort("column", SolrQuery.ORDER.asc);
//设置起始位置和返回条数
query.setStart(start);
query.setRows(count);
//获取总记录数
long numFound = 0;
try {
long begin1 = System.currentTimeMillis();
//client执行查询
QueryResponse response = client.query(query);
//获取所有文档
long end1 = System.currentTimeMillis();
logger.info("query used time : " + (end1 - begin1));
long begin = System.currentTimeMillis();
SolrDocumentList docs = response.getResults();
numFound = docs.getNumFound();
//封装subject
for (SolrDocument doc : docs) {
Collection<String> fieldNames = doc.getFieldNames();
JSONObject tempJson = new JSONObject();
for (String fieldName :fieldNames) {
Object fieldValue = doc.getFieldValue(fieldName);
tempJson.put(fieldName, fieldValue);
}
array.add(tempJson);
}
long end = System.currentTimeMillis();
logger.info("for used time : " + (end - begin));
} catch (Exception e) {
code = -1;
msg = e.toString();
e.printStackTrace();
}
json.put("start", start);
json.put("subject", array);
json.put("count", array.size());
json.put("total", numFound);
json.put("code", code);
json.put("msg", msg);
// json.put("columntype", columnArray);
return json;
}
public boolean updateWeightById(String collection, String c2code, int Weight) {
//设置查询集合
client.setDefaultCollection(collection);
//新建查询并设置查询字段
SolrQuery query = new SolrQuery();
String queryString ="id:" + c2code;
query.setQuery(queryString);
try {
long begin1 = System.currentTimeMillis();
//client执行查询
QueryResponse response = client.query(query);
//获取所有文档
long end1 = System.currentTimeMillis();
logger.info("query used time : " + (end1 - begin1));
long begin = System.currentTimeMillis();
SolrDocumentList docs = response.getResults();
//封装subject
SolrInputDocument newDoc = new SolrInputDocument();
for (SolrDocument doc : docs) {
Collection<String> fieldNames = doc.getFieldNames();
for (String fieldName :fieldNames) {
Object fieldValue = doc.getFieldValue(fieldName);
if ("point".equals(fieldName)) {
newDoc.addField("point", Weight);
} else {
newDoc.addField(fieldName, fieldValue);
}
}
}
newDoc.toString();
if (newDoc.size() > 0) {
client.add(newDoc);
client.commit();
}
long end = System.currentTimeMillis();
logger.info("for used time : " + (end - begin));
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* @param collection 查询的集合
* @param key 查询关键字
* @param column 过滤栏目
* @param start 起始位置
* @param count 返回条数
* @param quetyField 查询的字段
* @return 返回栏目
*/
// public JSONArray getColumnType(String collection, String key, int sdonly, int start,
// int count, String quetyField) {
// JSONArray columnArray = new JSONArray();
// //从redis中获取栏目列表
// String redisKey = SOLRCOLUMNPREFIX + "_" + key + "_" + sdonly;
String columnString = RedisClusterUtil.getInstance().get(redisKey, INDEX);
//
// if (StringUtils.isNotBlank(columnString)) {
// columnArray = JSONArray.parseArray(columnString);
// } else {
// //设置查询集合
// client.setDefaultCollection(collection);
// Map<String, Long> columnMap = new TreeMap<String, Long>();
// //新建查询并设置查询字段
// SolrQuery query = new SolrQuery();
// String queryString ="*" + key + "*";
// query.setQuery(queryString);
// query.set("fl", "score and column");
// query.set("df", "searchkey");
// query.set("defType","edismax");
// query.set("qf",quetyField);
// query.set("bf","div(point,100)");
// //sdonly为1只返回标清,否则返回全部
// if (sdonly == 1) {
// query.addFilterQuery("hdflag:" + 0);
// }
// //开启facet
// query.setFacet(true);
// query.addFacetField(new String[] {"column"});
// query.setFacetMinCount(MINCOUNT);
// query.setFacetMissing(false);
// query.setFacetSort(FacetParams.FACET_SORT_INDEX_LEGACY);
// //排序
// query.addSort("score", SolrQuery.ORDER.desc);
// query.addSort("column", SolrQuery.ORDER.asc);
// //设置返回条数
// query.setStart(start);
// query.setRows(MINCOUNT);
// try {
// long begin1 = System.currentTimeMillis();
// //client执行查询
// QueryResponse response = client.query(query);
// long end1 = System.currentTimeMillis();
// logger.info("query used time : " + (end1 - begin1));
// long begin = System.currentTimeMillis();
// //获取栏目,并把资讯栏目放到最后
// List<FacetField> facetFields = response.getFacetFields();
// for (FacetField f : facetFields) {
// List<Count> values = f.getValues();
// for (Count value : values) {
// columnMap.put(value.getName(), value.getCount());
// }
// }
// Set<String> keys = columnMap.keySet();
// for (String str : keys) {
// JSONObject columnJson = new JSONObject();
// if (StringUtils.isNotBlank(str) && !ZXKEY.equals(str)) {
// columnJson.put("column", str);
// columnJson.put("columnname", columnNameMap.get(str));
// columnJson.put("count", columnMap.get(str));
// columnArray.add(columnJson);
// }
// }
// if (columnMap.containsKey(ZXKEY)) {
// JSONObject zxJson = new JSONObject();
// zxJson.put("column", ZXKEY);
// zxJson.put("columnname", columnNameMap.get(ZXKEY));
// zxJson.put("count", columnMap.get(ZXKEY));
// columnArray.add(zxJson);
// }
//把栏目结果缓存到redis中
RedisClusterUtil.getInstance().setex(redisKey, SECONDS, columnArray.toString(),
INDEX);
// long end = System.currentTimeMillis();
// logger.info("for used time : " + (end - begin));
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
// return columnArray;
//
// }
/**
* @param collection 保存索引的集合
* @param bean 需要建索引的bean对象
* @return
*/
// public boolean index(String collection, WsMergedMediaImageBean bean) {
// boolean isOk = true;
// try {
// //设置查询集合
// client.setDefaultCollection(collection);
// SolrInputDocument doc = new SolrInputDocument();
// //去除不被索引项,如HD,BR等
// String tempName = bean.getName().replace("[BR]", "")
// .replace("[HD]", "")
// .replace("[4K]", "")
// .replace("[br]", "")
// .replace("[hd]", "")
// .replace("[4k]", "");
// //影片名多音字组合,以逗号分隔
// String temp_pinyin = null;
// if (tempName.length() > calPinYinCount) {
// temp_pinyin = PinYinUtil.getFirstSpell(tempName);
// } else {
// StringBuilder nameBuilder = new StringBuilder();
// HashSet<String> multiName = PinYinUtil.getMultiFirstSpell(tempName);
// for (String n : multiName) {
// nameBuilder.append(n).append(",");
// }
// temp_pinyin = nameBuilder.toString();
// }
//
// String name_pinyin = bean.getName() == null ? "" :
// temp_pinyin;
// //演员多音字组合,以逗号分隔
// StringBuilder castsBuilder = new StringBuilder();
// HashSet<String> multiCasts = PinYinUtil.getMultiFirstSpell(bean.getCasts());
// for (String cast : multiCasts) {
// castsBuilder.append(cast).append(",");
// }
// String casts_pinyin = bean.getCasts() == null ? "" :
// castsBuilder.toString();
// //导演多音字组合,以逗号分隔
// StringBuilder directorsBuilder = new StringBuilder();
// HashSet<String> multiDirectors = PinYinUtil.getMultiFirstSpell(bean.getDirectors());
// for (String director : multiDirectors) {
// directorsBuilder.append(director).append(",");
// }
// String directors_pinyin = bean.getDirectors() == null ? "" :
// directorsBuilder.toString();
// //设置solr文档对象
// doc.addField("code", bean.getC2code() == null ? "" : bean.getC2code());
// doc.addField("name", bean.getName() == null ? "" : bean.getName());
// doc.addField("name_pinyin", name_pinyin);
// doc.addField("indexname", tempName);
// doc.addField("image", "");
// doc.addField("basemark", bean.getBasemark() == null ? "" : bean.getBasemark());
// doc.addField("opmark", bean.getOpmark() == null ? "" : bean.getOpmark());
// doc.addField("rating", bean.getRating() == null ? "" : bean.getRating());
// doc.addField("column", bean.getColumntype() == null ? "" : bean.getColumntype());
// doc.addField("columnname", bean.getColumnname() == null ? "" : bean.getColumnname());
// doc.addField("seriestype", bean.getType() == null ? "" : bean.getType());
// doc.addField("poster", bean.getPoster() == null ? "" : bean.getPoster());
// doc.addField("still", bean.getStill() == null ? "" : bean.getStill());
// doc.addField("opimg1", bean.getOpimg1() == null ? "" : bean.getOpimg1());
// doc.addField("opimg2", bean.getOpimg2() == null ? "" : bean.getOpimg2());
// doc.addField("basetagsname", bean.getBasetagsname() == null ? "" : bean.getBasetagsname());
// doc.addField("directors", bean.getSourcedirectors() == null ? "" : bean.getSourcedirectors());
// doc.addField("directors_pinyin", directors_pinyin);
// doc.addField("casts", bean.getCasts() == null ? "" : bean.getCasts());
// doc.addField("casts_pinyin", casts_pinyin);
// doc.addField("volumncount", bean.getVolumncount() == null ? "" : bean.getVolumncount());
// doc.addField("hdflag", bean.getHdflag());
// doc.addField("point", DEFAULTPOINT);
// doc.addField("id", bean.getC2code() == null ? "" : bean.getC2code());
// //添加并提交文档
// client.add(doc);
// client.commit();
// } catch (Exception e) {
// isOk = false;
// e.printStackTrace();
// }
// return isOk;
// }
/**
* @param collection 保存索引的集合
* @param beans 需要建索引的bean列表
* @return
*/
// public boolean index(String collection, List<WsMergedMediaImageBean> beans) {
// boolean isOk = true;
// List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
// //记录已建索引数
// int indexCount = 0;
// //设置查询集合
// client.setDefaultCollection(collection);
// try {
// if (beans.size() > 0) {
// for (WsMergedMediaImageBean bean : beans) {
// SolrInputDocument doc = new SolrInputDocument();
// //去除不被索引项,如HD,BR等
// String tempName = bean.getName().replace("[BR]", "")
// .replace("[HD]", "")
// .replace("[4K]", "")
// .replace("[br]", "")
// .replace("[hd]", "")
// .replace("[4k]", "");
// //影片名多音字组合,以逗号分隔
// String temp_pinyin = null;
// if (tempName.length() > calPinYinCount) {
// temp_pinyin = PinYinUtil.getFirstSpell(tempName);
// } else {
// StringBuilder nameBuilder = new StringBuilder();
// HashSet<String> multiName = PinYinUtil.getMultiFirstSpell(tempName);
// for (String n : multiName) {
// nameBuilder.append(n).append(",");
// }
// temp_pinyin = nameBuilder.toString();
// }
//
// String name_pinyin = bean.getName() == null ? "" :
// temp_pinyin;
// //演员多音字组合,以逗号分隔
// StringBuilder castsBuilder = new StringBuilder();
// HashSet<String> multiCasts = PinYinUtil.getMultiFirstSpell(bean.getCasts());
// HashSet<String> filterSet = new HashSet<String>();
// for (String cast : multiCasts) {
// String[] castArray = cast.split(",");
// for (String c : castArray) {
// if (!filterSet.contains(c)) {
// castsBuilder.append(c).append(",");
// filterSet.add(c);
// }
// }
//
// }
// String casts_pinyin = bean.getCasts() == null ? "" :
// castsBuilder.toString();
// //导演多音字组合,以逗号分隔
// filterSet.clear();
// StringBuilder directorsBuilder = new StringBuilder();
// HashSet<String> multiDirectors = PinYinUtil.getMultiFirstSpell(bean.getDirectors());
// for (String director : multiDirectors) {
// String[] directorArray = director.split(",");
// for (String d : directorArray) {
// if (!filterSet.contains(d)) {
// directorsBuilder.append(d).append(",");
// filterSet.add(d);
// }
// }
// }
// String directors_pinyin = bean.getDirectors() == null ? "" :
// directorsBuilder.toString();
// //设置solr文档对象
// doc.addField("code", bean.getC2code() == null ? "" : bean.getC2code());
// doc.addField("title", bean.getName() == null ? "" : bean.getName());
// doc.addField("name_pinyin", name_pinyin);
// doc.addField("indexname", tempName);
// doc.addField("image", "");
// doc.addField("basemark", bean.getBasemark() == null ? "" : bean.getBasemark());
// doc.addField("opmark", bean.getOpmark() == null ? "" : bean.getOpmark());
// doc.addField("rating", bean.getRating() == null ? "" : bean.getRating());
// doc.addField("column", bean.getColumntype() == null ? "" : bean.getColumntype());
// doc.addField("columnname", bean.getColumnname() == null ? "" : bean.getColumnname());
// doc.addField("seriestype", bean.getType() == null ? "" : bean.getType());
// doc.addField("poster", bean.getPoster() == null ? "" : bean.getPoster());
// doc.addField("still", bean.getStill() == null ? "" : bean.getStill());
// doc.addField("opimg1", bean.getOpimg1() == null ? "" : bean.getOpimg1());
// doc.addField("opimg2", bean.getOpimg2() == null ? "" : bean.getOpimg2());
// doc.addField("basetagsname", bean.getBasetagsname() == null ? "" : bean.getBasetagsname());
// doc.addField("directors", bean.getSourcedirectors() == null ? "" : bean.getSourcedirectors());
// doc.addField("directors_pinyin", directors_pinyin);
// doc.addField("casts", bean.getCasts() == null ? "" : bean.getCasts());
// doc.addField("casts_pinyin", casts_pinyin);
// doc.addField("volumncount", bean.getVolumncount() == null ? "" : bean.getVolumncount());
// doc.addField("hdflag", bean.getHdflag());
// doc.addField("point", DEFAULTPOINT);
// doc.addField("id", bean.getC2code() == null ? "" : bean.getC2code());
// docs.add(doc);
// indexCount++;
// }
// //添加并提交文档
// client.add(docs);
// client.commit();
// logger.info("build index success,commited index count : " + indexCount);
// }
//
// } catch (Exception e) {
// isOk = false;
// logger.info("build index error,commited index count : " + indexCount);
// logger.info(e.toString());
// e.printStackTrace();
// }
// return isOk;
// }
/**
* @param collection 保存索引的集合
* @param bean 需要删除索引的bean对象
* @return
*/
// public boolean deleteByName(String collection, WsMergedMediaImageBean bean) {
// //设置查询集合
// client.setDefaultCollection(collection);
// boolean isOk = true;
// try {
// client.deleteByQuery("name:" + bean.getName());
// //client.deleteById(bean.getC2code());
// client.commit();
// } catch (Exception e) {
// isOk = false;
// e.printStackTrace();
// }
// return isOk;
// }
/**
* @param collection 保存索引的集合
* @param bean 需要删除索引的bean对象
* @return
*/
// public boolean deleteByCode(String collection, WsMergedMediaImageBean bean) {
// //设置查询集合
// client.setDefaultCollection(collection);
// boolean isOk = true;
// try {
// //client.deleteByQuery("name:" + bean.getName());
// client.deleteById(bean.getC2code());
// client.commit();
// } catch (Exception e) {
// isOk = false;
// e.printStackTrace();
// }
// return isOk;
// }
/**
* @param collection 保存索引的集合
* @param bean 需要删除索引的bean对象
* @return
*/
public boolean deleteByCode(String collection, List<String> ids) {
//设置查询集合
client.setDefaultCollection(collection);
boolean isOk = true;
try {
if (ids.size() > 0) {
client.deleteById(ids);
client.commit();
}
} catch (Exception e) {
isOk = false;
e.printStackTrace();
}
return isOk;
}
public String getCollection() {
return collection;
}
public String getQueryField() {
return queryField;
}
public String getQueryFieldPinYin() {
return queryFieldPinYin;
}
public String getFieldList() {
return fieldList;
}
}
solr solrutil 工具类
最新推荐文章于 2024-04-25 17:13:06 发布