Java 对 solr 的增删改查,java源码

solr 安装配置完成后,如何在java代码中应用起来呢。

首先我们先创建一个类 solrUtils.java

//                         _ooOoo_  
//                        o8888888o  
//                        88" . "88  
//                        (| -_- |)  
//                         O\ = /O  
//                     ____/`---'\____  
//                   .   ' \\| |// `.  
//                    / \\||| : |||// \  
//                  / _||||| -:- |||||- \  
//                    | | \\\ - /// | |  
//                  | \_| ''\---/'' | |  
//                   \ .-\__ `-` ___/-. /  
//                ___`. .' /--.--\ `. . __  
//             ."" '< `.___\_<|>_/___.' >'"".  
//            | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//              \ \ `-. \_ __\ /__ _/ .-` / /  
//      ======`-.____`-.___\_____/___.-`____.-'======  
//                         `=---='  
//
//      .............................................  
//               佛祖保佑             永无BUG 
//       佛曰:  
//               写字楼里写字间,写字间里程序员;  
//               程序人员写程序,又拿程序换酒钱。  
//               酒醒只在网上坐,酒醉还来网下眠;  
//               酒醉酒醒日复日,网上网下年复年。  
//               但愿老死电脑间,不愿鞠躬老板前;  
//               奔驰宝马贵者趣,公交自行程序员。  
//               别人笑我忒疯癫,我笑自己命太贱;  
//               不见满街漂亮妹,哪个归得程序员? 
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
 
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
 
import com.jfinal.kit.PropKit;
import com.sunjs.kit.ToolsUtils;
import com.sunjs.model.TBlogArticle;
 
public class SolrUtils {
     
    protected static final Logger LOG = Logger.getLogger(SolrUtils.class);
 
    private final static String BASE_URL = "http://localhost:8983/solr/sunjs";
 
    /**
     * 创建SolrServer对象
     * 
     * 该对象有两个可以使用,都是线程安全的 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的 2、
     * EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了 3、solr
     * 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
     * 
     * @return
     */
    public static SolrClient createSolrServer() {
        return new HttpSolrClient.Builder(BASE_URL).build();
    }
 
    public static Integer addDucument(TBlogArticle article) {
        if(article==null){
            return 30850;
        }
        Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
 
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", article.getLong("id"));
        doc.addField("category_id", article.getLong("category_id"));
        doc.addField("uuid", article.getStr("uuid"));
        doc.addField("visit_num", article.getInt("visit_num"));
        doc.addField("pic_url", article.getStr("pic_url"));
        doc.addField("author", article.getStr("author"));
        doc.addField("tags", article.getStr("tags"));
        doc.addField("tags_name", article.getStr("tags_name"));
        doc.addField("title", article.getStr("title"));
        doc.addField("digest", article.getStr("digest"));
        doc.addField("add_time", article.getDate("add_time"));
        docs.add(doc);
        SolrClient solrClient = createSolrServer();
        try {
            solrClient.add(docs);
            UpdateResponse rspcommit = solrClient.commit();
            return rspcommit.getStatus()==0?30800:30850;
        } catch (Exception e) {
            e.printStackTrace();
            LOG.info(ToolsUtils.print("solr","索引失败", article.getStr("title"), e.getMessage()));
        } finally{
            try {
                LOG.info(ToolsUtils.print("solr","索引成功", article.getStr("title")));
                solrClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 30850;
    }
     
    public static Integer deleteById(Object id) {
        if(id!=null && StringUtils.isEmpty(id+"")){
            return 30892;
        }
        SolrClient solrClient = createSolrServer();
        try {
            if(id.equals("*")){
                //删除所有
                // Preparing the Solr document
                solrClient.deleteByQuery("*");
                UpdateResponse rspcommit = solrClient.commit();
                return rspcommit.getStatus()==0?30891:30892;
            }else{
                solrClient.deleteById(id+"");
                UpdateResponse rspcommit = solrClient.commit();
                return rspcommit.getStatus()==0?30891:30892;
            }
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
            LOG.info(ToolsUtils.print("solr","删除索引失败", "ID:"+id, e.getMessage()));
        } finally{
            try {
                LOG.info(ToolsUtils.print("solr","删除索引成功", "ID:"+id));
                solrClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 30892;
    }
 
}
public static Page<TBlogArticle> queryFromSolr(Integer pageNumber, Integer pageSize, String reqparam) {
        Page<TBlogArticle> page = new Page<TBlogArticle>();
        if(StringUtils.isEmpty(reqparam)){
            reqparam="*";
        }
 
        SolrQuery query = new SolrQuery();
        query.setHighlight(true);
        query.addHighlightField("digest");
        query.addHighlightField("title");
        query.setHighlightSimplePre("<font color=\"red\">");
        query.setHighlightSimplePost("</font>");
//        query.setHighlightSnippets(1);
//        query.setHighlightFragsize(2);
        query.setStart((pageNumber-1)*pageSize);
        query.setRows(pageSize);
        query.set("q", "title:"+reqparam+" OR "+"digest:"+reqparam);
        List<TBlogArticle> articles = new ArrayList<TBlogArticle>();
        SolrClient solrClient = createSolrServer();
        try {
            QueryResponse response = solrClient.query(query);
            SolrDocumentList docList = response.getResults();
            Map<String, Map<String, List<String>>> highlightMap = response.getHighlighting();
             
            Iterator<SolrDocument> it = docList.iterator();
            while (it.hasNext()) {
                SolrDocument doc = it.next();
                Long id = Long.valueOf(doc.getFieldValue("id").toString());
                Long category_id = Long.valueOf(doc.getFieldValue("category_id")==null?"0":doc.getFieldValue("category_id").toString());
                Integer visit_num = Integer.valueOf(doc.getFieldValue("visit_num")==null?"0":doc.getFieldValue("visit_num").toString());
                String uuid = doc.getFieldValue("uuid")==null?null:doc.getFieldValue("uuid").toString();
                String pic_url = doc.getFieldValue("pic_url")==null?null:doc.getFieldValue("pic_url").toString();
                String author = doc.getFieldValue("author")==null?null:doc.getFieldValue("author").toString();
                String tags = doc.getFieldValue("tags")==null?null:doc.getFieldValue("tags").toString();
                String tags_name = doc.getFieldValue("tags_name")==null?null:doc.getFieldValue("tags_name").toString();
                String title = doc.getFieldValue("title")==null?null:doc.getFieldValue("title").toString();
                String digest = doc.getFieldValue("digest")==null?null:doc.getFieldValue("digest").toString();
                Date add_time = (Date)doc.getFieldValue("add_time");
                 
                TBlogArticle article = new TBlogArticle();
                article.set("id", id);
                article.set("category_id", category_id);
                article.set("uuid", uuid);
                article.set("visit_num", visit_num);
                article.set("pic_url", pic_url);
                article.set("author", author);
                article.set("tags", tags);
                article.put("tags_name", tags_name);
                article.set("title", title);
                article.set("digest", digest);
                article.put("title_html", title);
                article.put("digest_html", digest);
                article.set("add_time", add_time);
                 
                List<String> titleList=highlightMap.get(id+"").get("title");
                List<String> digestList=highlightMap.get(id+"").get("digest");
                //获取并设置高亮的字段title
                if(titleList!=null && titleList.size()>0){
                    article.put("title_html", titleList.get(0));
                }
                //获取并设置高亮的字段content
                if(digestList!=null && digestList.size()>0){
                    article.put("digest_html", digestList.get(0));
                }
                articles.add(article);
            }
            Integer totalRow = Integer.valueOf(docList.getNumFound()+"");
            Integer totalPage = (int) (totalRow % pageSize == 0 ? totalRow / pageSize : Math.ceil((double)totalRow / (double)pageSize)) ;
            page = new Page<TBlogArticle>(articles, pageNumber, pageSize, totalPage, totalRow);
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                solrClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return page;
    }

上边可能有部分类报异常,不过都无关紧要,主要代码都在。

如果查询出来的字段:doc.getFieldValue 是一个数组,也就是多列。那么只需要在配置文件中操作一下即可:

进入 /Users/sun/Documents/solr-6.5.1/server/solr/my_core/conf 这个目录下,打开managed-schema

找到是数组的列,比如是add_time:

<field name="add_time" type="tdates" multiValued="false"/>

增加 multiValued="false" 即可!

如何想要删除全部索引

SolrUtils.deleteById("*");
删除执行id 为 1 的索引

SolrUtils.deleteById(1);

相关阅读:

linux 系统安装 solr,以及各版本的下载地址

solr 6.5 配置中文分词 IK Analyzer

solr 增加账号密码,solr 6.5 配置用户名密码


版权属于: 技术客

原文地址: https://www.sunjs.com/article/detail/3c89d0ce0dd14cc09079a02121520d91.html

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值