打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
slor简单封装
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;
}
}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
IKAnalyzer中文分词器介绍
Java RPC通信机制之XML-RPC:Apache XML-RPC 3.0开发简介Java RPC通信机制之XML-RPC:Apache XML-RPC 3.0开发简介
Solr开发文档
[原创]全文搜索引擎Lucene学习笔记(页 1) - 『 编程设计 』 - 青韶论坛 湘...
lucene入门与使用
lucene自带的两个demo的运行测试方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服