solr项目实战

小编想要总结一下项目中用到的solr部分所以特意来总结一下。包括和Spring的结合。先说一下需求。

【需求】

教师添加题的时候,要根据题干内容自动的推荐已经添加的相似的题。

【pom.xml】

 <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>7.1.0</version>
</dependency>

【spring-context.xml】

 <!--单机版solr客户端-->
    <bean id="httpSolrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
        <constructor-arg name="builder" value="${solr.address}"/>
    </bean>

【solr.properties】

solr.address=http://xxx.xxx.xx.xxx:8080/solr/coreitoo

【serviceImpl.java】

/**
 * 题库管理 solr查询
 *
 * @author 滕柳
 */
@Service("Service")
public class ServiceImpl{
     @Autowired
    private HttpSolrClient solrServer;
    /**
     * 抽取添加到索引的方法
     *
     * @param questionMainEntityList 题库集合
     * @author 滕柳
     */
    public void addSolr(List<QuestionMainEntity> questionMainEntityList) {
        //插入到solr中
        try {
            for (int i = 0; questionMainEntityList != null && !questionMainEntityList.isEmpty() && i < questionMainEntityList.size(); i++) {
                //创建文档对象
                SolrInputDocument document = new SolrInputDocument();
                //添加域
                document.addField("id", questionMainEntityList.get(i).getId());
                document.addField(QUESTION_CONTENT, questionMainEntityList.get(i).getQuestionContent());
                //添加到索引库
                solrServer.add(document);
                //提交
                solrServer.commit();
            }
        } catch (SolrServerException e) {
            logger.error("solr插入失败SolrServerException", e);
        } catch (IOException e) {
            logger.error("solr插入失败IOException", e);
        } catch (Exception e) {
            logger.error("solr插入失败Exception", e);
        }
    }
    
     /**
     * 使用solr查询题干内容
     *
     * @param questionContent 题干信息
     * @return 符合条件的题干实体集合
     * @author 滕柳
     */
    @Override
    public List<QuestionMainEntity> getQuestionContentBySolr(String questionContent) throws SolrServerException, IOException {
        List<QuestionMainEntity> questionContentList = new ArrayList<>();
        //执行查询,创建一个查询对象
        SolrQuery query = new SolrQuery();
        query.setQuery("question_content:" + questionContent);
        // 开启高亮组件或用
        query.setHighlight(true);
        // 高亮字段
        query.addHighlightField(QUESTION_CONTENT);
        //标记,高亮关键字前缀
        query.setHighlightSimplePre("<font color='red'>");
        //后缀
        query.setHighlightSimplePost("</font>");
        //执行查询
        QueryResponse response = solrServer.query(query);
        //取查询结果
        SolrDocumentList solrDocumentList = response.getResults();
        for (SolrDocument solrDocument : solrDocumentList) {
            QuestionMainEntity questionMainEntity = new QuestionMainEntity();
            questionMainEntity.setId("id");
            String question_content = solrDocument.get("question_content").toString();
            questionMainEntity.setQuestionContent(question_content);
            questionContentList.add(questionMainEntity);
        }
        return questionContentList;
    }

    /**
     * 检查solr中是否有数据
     *
     * @author 滕柳
     */
    @Override
    public void querySolr() throws SolrServerException, IOException {
        //执行查询,创建一个查询对象
        SolrQuery query = new SolrQuery();
        query.set("q", "*:*");
        //执行查询
        QueryResponse response = solrServer.query(query);
        //取查询结果
        SolrDocumentList solrDocumentList = response.getResults();
        if (response.getResults().isEmpty()) {
            importSolr();
        } else {
            QuestionMainExample questionMainExample = new QuestionMainExample();
            QuestionMainCriteria questionMainCriteria = questionMainExample.createCriteria();
            questionMainCriteria.andIsDeleteEqualTo((byte) 0);
            long count = questionMainDao.getCountByExample(questionMainExample);
            //如果相等,则不再需要向solr中导入数据
            if (solrDocumentList.getNumFound() != count) {
                importSolr();
            }
        }
    }

    // deleteSingleProblemMain-删除单个题目
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteSingleProblemMain(String problemId, String operator) {
        List<String> listAll = getPidAndAllHisChildByPid(idList, problemId);
        //2.删除题目 同时删除solr
        if (questionMainDao.updateToHistoryFlag(listAll) >= 0 && questionSubDao.deleteByQuestionMainId(listAll, operator) >= 0) {
            try {
                solrServer.deleteById(listAll);
                solrServer.commit();
            } catch (SolrServerException e) {
                e.printStackTrace();
                logger.error("在solr中删除题库内容失败");
            } catch (IOException e) {
                e.printStackTrace();
                logger.error("在solr中删除题库内容失败", e);
            }
}

删除的方法还有一个根据查询的题型内容进行删除

@Test
	public void deleteDocumentByQuery() throws Exception {
		solrServer.deleteByQuery("question_content:我");
		solrServer.commit();
	}

好了小编的实战关于添加查询删除就先写到这里了。这个是一个借口用的会后直接调用就好了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
    本课程全程使用目前比较流行的开发工具idea进行开发,涉及到目前互联网项目中最常用的高并发解决方案技术, 如dubbo,redis,solr,freemarker,activeMQ,springBoot框架,微信支付,nginx负载均衡,电商活动秒杀,springSecurity安全框架,FastDFS分布式文件服务器,还会涉及到代码生成器,   前台的技术有angularJS和BootStrap框架,此课程内容丰富实战性强,如果你还是传统项目的开发人员,那你学完本课程会有很大的收获,让你的薪资上涨,5K以上,让你完全感受到了互联网思维带来的高 并发解决方案的思路,如果你是开发的小白,建议你学完Spring,SpringMVC,MyBatis框架后再来学习本门课程,学完以后会让你完全体验到企业级开发的流程.在职开发人员学完后会让你的薪资更高,让你更了解互联网是如何解决高并发 学完SSM框架的同学就可以学习,能让你切身感受到企业级开发环境目标1:完成solr环境安装、中文分析器和业务域的配置目标2:会使用Spring Data Solr完成增删改查操作目标3:完成批量数据导入功能目标4:完成按关键字搜索功能目标5:实现考拉易购搜索结果高亮显示功能目标6:说出考拉易购搜索的业务规则和实现思路目标7:完成查询分类列表的功能目标8:完成缓存品牌和规格数据的功能目标9:完成显示品牌和规格数据的功能目标10:完成过滤条件构建的功能目标11:完成过滤查询的功能目标11:实现考拉易购价格区间筛选功能目标12:实现搜索结果分页功能目标13:理解多关键字搜索目标14:实现搜索结果排序功能目标15:实现隐藏品牌列表功能目标16:实现搜索页与首页对接功能目标17:完成更新索引库的功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值