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; } } |
|
来自: 走墨 > 《slor的注意事项》