package org.my431.resource.services;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import net.sf.cglib.beans.BeanCopier;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest.METHOD;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
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.SpellCheckResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.my431.base.model.BaseBookCatelog;
import org.my431.base.services.CacheBaseBookCatelogManager;
import org.my431.base.services.CacheBaseBookVersionManager;
import org.my431.base.services.CacheBasePropertiesManager;
import org.my431.platform.utils.ContextUtils;
import org.my431.resource.index.BaseBookCatelogIndex;
import org.my431.resource.index.SdResResourceIndex;
import org.my431.resource.model.SdResResource;
import org.my431.resource.model.SdResTextbookMap;
import org.my431.taglib.My431Function;
/**
* solrCloud 操作索引类。
* @author wangzhen
*
*/
public class IndexManager {
/**
* 获取server连接
* @return
*/
public static CloudSolrServer getServer(String collection){
String zkHostString = My431Function.getValueByCode("zkHost");
CloudSolrServer server= new CloudSolrServer(zkHostString);
org.apache.log4j.Logger.getRootLogger().debug("collection======================================="+collection);
server.setDefaultCollection(collection);
server.setZkClientTimeout(5000);
server.setZkConnectTimeout(5000);
return server;
}
/**
* 增加单个索引
* @param doc
* <br>
* 带^_^必填属性,_value为key对应的文字属性,如subject存学科key,subject_value存文字。
* <br>
* ^_^id:索引不分词;id<br>
* name:索引分词;<br>
* price:索引float;<br>
* store:评分;<br>
* ^_^title:索引分词;标题<br>
* subject:索引分词;学科<br>
* subject_value:索引不分词;学科<br>
* ^_^description:索引分词;简介<br>
* comments:索引分词;<br>
* author:索引分词;<br>
* ^_^keywords:索引分词;拼搜索关键词,都用这个字段进行搜索。关键词。<br>
* category:索引分词;<br>
* url:索引分词;<br>
* content_type:索引不分词;<br>
* last_modified:索引date;<br>
* content:不索引分词;<br>
* payloads:索引分词;<br>
* links:索引不分词;<br>
*
* ext:索引不分词;资源类型<br>
* ext_value:索引不分词;资源类型,文字<br>
* file_size:不索引不分词;文件大小<br>
*
* resource_type:索引不分词;资源分类<br>
* resource_type_value:索引不分词;资源分类文字<br>
* text_book:索引不分词;知识点<br>
* text_book_value:索引不分词;知识点<br>
* version_id:索引不分词;版本id<br>
* version:索引不分词;版本<br>
* source:索引不分词;来源<br>
* is_price:索引分词;是否收费,0否,1是<br>
* view_count:不索引不分词;浏览数量<br>
* download_count:不索引不分词;下载数量<br>
* seq_no:不索引不分词;排序<br>
* audit_status:不索引不分词;状态<br>
* thumbnail:不索引不分词;缩略图<br>
* is_top:不索引不分词;是否置顶<br>
* board_id:不索引不分词;板块id<br>
* evl_count:不索引不分词;参与评价的用户数<br>
* evl_score:不索引不分词;平均分<br>
* cost:不索引不分词;价钱<br>
* res_column:不索引不分词;栏目<br>
* company:不索引不分词;公司<br>
* language:不索引不分词;语言<br>
* edu_type:不索引不分词;语言<br>
* grade_level:不索引不分词;<br>
* learner:不索引不分词;<br>
* grade:不索引不分词;<br>
* meta_type:不索引不分词;<br>
* meta_format:不索引不分词;<br>
* meta_special:不索引不分词;<br>
* meta_curriclum_standard:不索引不分词;<br>
* *_seq:排序通用字段,*可用任意代替<br>
*/
public static void addIndex(SolrInputDocument doc,String collection) {
CloudSolrServer server=getServer(collection);
try {
server.add(doc);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
/**
* 增加对象
* @param obj
*/
public static void addBean(Object obj,String collection) {
CloudSolrServer server=getServer(collection);
try {
server.addBean(obj);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
public static void addBeanList(List<Object> beans,String collection) {
CloudSolrServer server=getServer(collection);
try {
server.addBeans(beans);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
/**
* 增加批量索引,效率较高。
* @param docs
*/
public static void addIndexList(Collection<SolrInputDocument> docs,String collection) {
CloudSolrServer server=getServer(collection);
try {
server.add(docs);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
/**
* 删除单个索引
* @param id
*/
public static void delIndex(String id,String collection) {
CloudSolrServer server=getServer(collection);
try {
server.deleteById(id);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
/**
* 删除批量索引,效率较高。
* @param ids
*/
public static void delIndexList(List<String> ids,String collection){
CloudSolrServer server=getServer(collection);
try {
server.deleteById(ids);
server.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
}
/**
* 查询
* @param params
* @return
*/
public static QueryResponse query(ModifiableSolrParams params,String collection){
CloudSolrServer server=getServer(collection);
try {
SolrQuery query = new SolrQuery();
query.add(params);
query.setHighlight(true); //set other params as needed
// query.setParam("hl.fl", "keywords","title","description","name");
query.addHighlightField("title");
query.addHighlightField("description");
query.addHighlightField("name");
query.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
query.setHighlightSimplePost("</font>");//后缀
query.setHighlightSnippets(1);//结果分片数,默认为1
// query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
//分片信息
query.setFacet(true);
query.setFacetMinCount(1);
query.setFacetLimit(2);//段
query.addFacetField("keywords");//分片字段
QueryResponse response = server.query(query,METHOD.POST);
return response;
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
return null;
}
/**
* 查询
* @param params
* @return
*/
public static QueryResponse querySuggest(ModifiableSolrParams params,String collection){
CloudSolrServer server=getServer(collection);
try {
SolrQuery query = new SolrQuery();
query.add(params);
query.set("qt", "/suggest");
query.set("suggest.build", "true");
query.set("suggest.dictionary", "mySuggester");
query.setHighlight(true); //set other params as needed
// query.setParam("hl.fl", "keywords","title","description","name");
// query.addHighlightField("title");
// query.addHighlightField("description");
// query.addHighlightField("name");
//
// query.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
// query.setHighlightSimplePost("</font>");//后缀
QueryResponse response = server.query(query);
return response;
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
return null;
}
public static void addIndexRes(String resId){
SdResResourceManager sdResResourceManager=(SdResResourceManager)ContextUtils.getBean("sdResResourceManager");
SdResTextbookMapManager sdResTextbookMapManager=(SdResTextbookMapManager)ContextUtils.getBean("sdResTextbookMapManager");
SdResResource resource=sdResResourceManager.get(resId);
SdResResourceIndex resourceIndex=new SdResResourceIndex();
BeanCopier copier = BeanCopier.create(SdResResource.class, SdResResourceIndex.class, false);
copier.copy(resource, resourceIndex, null);
List<SdResTextbookMap> textbookList=sdResTextbookMapManager.findBy("resId", resource.getResourceId());
if(textbookList!=null&&textbookList.size()>0){
String textBookCode="";
String textBookValue="";
for(SdResTextbookMap sdResTextbookMap:textbookList){
if(textBookCode.equals("")){
BaseBookCatelog bc=CacheBaseBookCatelogManager.getKcObjectByCode(sdResTextbookMap.getTextbookCode());
if(bc!=null){
textBookCode=bc.getCode();
textBookValue=bc.getName();
if(bc.getVersionId()!=null){
resourceIndex.setVersionId(bc.getVersionId());
resourceIndex.setVersion(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getName());
resourceIndex.setSubjectCode(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode());
if(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode())!=null)
resourceIndex.setSubjectValue(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode()).getPropertyValue());
}
}
}else{
BaseBookCatelog bc=CacheBaseBookCatelogManager.getKcObjectByCode(sdResTextbookMap.getTextbookCode());
if(bc!=null){
textBookCode=textBookCode+","+bc.getCode();
textBookValue=textBookValue+","+bc.getName();
if(bc.getVersionId()!=null){
resourceIndex.setVersionId(bc.getVersionId());
resourceIndex.setVersion(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getName());
resourceIndex.setSubjectCode(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode());
if(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode())!=null)
resourceIndex.setSubjectValue(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode()).getPropertyValue());
}
}
}
}
resourceIndex.setTextBookCode(textBookCode);
resourceIndex.setTextBookValue(textBookValue);
}
org.apache.log4j.Logger.getRootLogger().debug(resourceIndex);
resourceIndex.setResourceType(resource.getResourceType());
org.apache.log4j.Logger.getRootLogger().debug(resourceIndex.getResourceType());
IndexManager.addBean(resourceIndex,"resource");
}
public static void addIndexRes(SdResResource resource){
SdResTextbookMapManager sdResTextbookMapManager=(SdResTextbookMapManager)ContextUtils.getBean("sdResTextbookMapManager");
SdResResourceIndex resourceIndex=new SdResResourceIndex();
BeanCopier copier = BeanCopier.create(SdResResource.class, SdResResourceIndex.class, false);
copier.copy(resource, resourceIndex, null);
List<SdResTextbookMap> textbookList=sdResTextbookMapManager.findBy("resId", resource.getResourceId());
if(textbookList!=null&&textbookList.size()>0){
String textBookCode="";
String textBookValue="";
for(SdResTextbookMap sdResTextbookMap:textbookList){
if(textBookCode.equals("")){
BaseBookCatelog bc=CacheBaseBookCatelogManager.getKcObjectByCode(sdResTextbookMap.getTextbookCode());
if(bc!=null){
textBookCode=bc.getCode();
textBookValue=bc.getName();
if(bc.getVersionId()!=null){
resourceIndex.setVersionId(bc.getVersionId());
resourceIndex.setVersion(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getName());
resourceIndex.setSubjectCode(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode());
if(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode())!=null)
resourceIndex.setSubjectValue(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode()).getPropertyValue());
}
}
}else{
BaseBookCatelog bc=CacheBaseBookCatelogManager.getKcObjectByCode(sdResTextbookMap.getTextbookCode());
if(bc!=null){
textBookCode=textBookCode+","+bc.getCode();
textBookValue=textBookValue+","+bc.getName();
if(bc.getVersionId()!=null){
resourceIndex.setVersionId(bc.getVersionId());
resourceIndex.setVersion(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getName());
resourceIndex.setSubjectCode(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode());
if(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode())!=null)
resourceIndex.setSubjectValue(CacheBasePropertiesManager.getPropertiesByPropertyKey(CacheBaseBookVersionManager.getBaseBookVersion(bc.getVersionId()).getSubjectCode()).getPropertyValue());
}
}
}
}
resourceIndex.setTextBookCode(textBookCode);
resourceIndex.setTextBookValue(textBookValue);
}
org.apache.log4j.Logger.getRootLogger().debug(resourceIndex);
resourceIndex.setResourceType(resource.getResourceType());
org.apache.log4j.Logger.getRootLogger().debug(resourceIndex.getResourceType());
IndexManager.addBean(resourceIndex,"resource");
}
public static void addIndexTextBook(BaseBookCatelog bc){
BaseBookCatelogIndex textBookIndex=new BaseBookCatelogIndex();
BeanCopier copier = BeanCopier.create(BaseBookCatelog.class, BaseBookCatelogIndex.class, false);
copier.copy(bc, textBookIndex, null);
org.apache.log4j.Logger.getRootLogger().debug(textBookIndex);
textBookIndex.setResourceType("textbook");
IndexManager.addBean(textBookIndex,"textbook");
}
public static void main(String[] args) {
/*
// SolrInputDocument doc = new SolrInputDocument();
// doc.addField( "id", "resource_id1", 1.0f );
// doc.addField( "keywords", "测试resource", 1.0f );
// doc.addField( "price", 10 );
//
// addIndex(doc,"resource");
// SdResResourceIndex resourceIndex=new SdResResourceIndex();
// resourceIndex.setResourceId("111");
// addBean(resourceIndex,"resource");
ModifiableSolrParams params = new ModifiableSolrParams();
// 查询关键词,*:*代表所有属性、所有值,即所有index
//AND 并且,OR 或者,空格 等同于 OR,NOT 不包含, 50 <= price <= 200 (price:[50 TO 200]),
params.set("q", "keywords:数学");
// params.set("q", "id:id3");
// 分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
params.set("start", 0);
params.set("rows", 10);
//过滤器查询,可以提高性能 filter 类似多个条件组合,如and
//params.addFilterQuery("id:VA902B");
//params.addFilterQuery("price:[50 TO 200]");
//params.addFilterQuery("popularity:[* TO 5]");
//params.addFilterQuery("weight:*");
//0 < popularity < 6 没有等于
//params.addFilterQuery("popularity:{0 TO 6}");
// 排序,,如果按照id 排序,,那么将score desc 改成 id desc(or asc)
params.set("sort", "score desc");
// 返回信息 * 为全部 这里是全部加上score,如果不加下面就不能使用score
params.set("fl", "*,score");//resource
params.set("collection", "resource");//resource
QueryResponse queryResponse= query(params,"resource");
SolrDocumentList list = queryResponse.getResults();
org.apache.log4j.Logger.getRootLogger().debug("查询数量:" + list.getNumFound());
org.apache.log4j.Logger.getRootLogger().debug("查询时间:" + queryResponse.getQTime());
for(int i=0;i<list.size();i++){
SolrDocument resultDoc =list.get(i);
String id=resultDoc.get("id").toString();
org.apache.log4j.Logger.getRootLogger().debug(resultDoc);
//高亮
if(queryResponse.getHighlighting().get(id)!=null){
org.apache.log4j.Logger.getRootLogger().debug(queryResponse.getHighlighting().get(id).get("title"));
org.apache.log4j.Logger.getRootLogger().debug(queryResponse.getHighlighting().get(id).get("description"));
org.apache.log4j.Logger.getRootLogger().debug(queryResponse.getHighlighting().get(id).get("name"));
}
}
//输出分片信息
// List<FacetField> facets = queryResponse.getFacetFields();
//
// for (FacetField facet : facets) {
// List<Count> facetCounts = facet.getValues();
// for (FacetField.Count count : facetCounts) {
// org.apache.log4j.Logger.getRootLogger().debug(count.getName() + ": " + count.getCount());
// }
// }
*/
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("suggest.q", "数学");
QueryResponse queryResponse= querySuggest(params,"resource");
org.apache.log4j.Logger.getRootLogger().debug(queryResponse.getResults());
SpellCheckResponse spellCheckResponse = queryResponse.getSpellCheckResponse();
if (spellCheckResponse != null) {
List<Suggestion> suggestionList = spellCheckResponse.getSuggestions();
for (Suggestion suggestion : suggestionList) {
org.apache.log4j.Logger.getRootLogger().debug("Suggestions NumFound: "
+ suggestion.getNumFound());
org.apache.log4j.Logger.getRootLogger().debug("Token: " + suggestion.getToken());
System.out.print("Suggested: ");
List<String> suggestedWordList = suggestion.getAlternatives();
for (String word : suggestedWordList) {
org.apache.log4j.Logger.getRootLogger().debug(word + ", ");
}
}
}
}
public static Map queryResById(String resId){
ModifiableSolrParams params=new ModifiableSolrParams();
String keyWords="delete_flag:0 AND forbidden_flag:1 AND id:"+resId;
params.set("q", keyWords);
params.set("start", 0);
params.set("rows", 1);
params.set("fl", "*");
params.set("collection", "resource");
CloudSolrServer server=getServer("resource");
try {
SolrQuery query = new SolrQuery();
query.add(params);
query.setHighlight(true);
query.addHighlightField("title");
query.addHighlightField("description");
query.addHighlightField("name");
query.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
query.setHighlightSimplePost("</font>");//后缀
QueryResponse response = server.query(query);
SolrDocumentList dl=response.getResults();
if(dl.size()==1){
return dl.get(0);
}
return null;
} catch (Exception e) {
e.printStackTrace();
}finally {
server.shutdown();
}
return null;
}
}