小编想要总结一下项目中用到的solr部分所以特意来总结一下。包括和Spring的结合。先说一下需求。
教师添加题的时候,要根据题干内容自动的推荐已经添加的相似的题。
org.apache.solr
solr-solrj
7.1.0
solr.address=http://xxx.xxx.xx.xxx:8080/solr/coreitoo
/**
* 题库管理 solr查询
*
* @author 滕柳
*/
@Service("Service")
public class ServiceImpl{
@Autowired
private HttpSolrClient solrServer;
/**
* 抽取添加到索引的方法
*
* @param questionMainEntityList 题库集合
* @author 滕柳
*/
public void addSolr(List 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 getQuestionContentBySolr(String questionContent) throws SolrServerException, IOException {
List questionContentList = new ArrayList<>();
//执行查询,创建一个查询对象
SolrQuery query = new SolrQuery();
query.setQuery("question_content:" + questionContent);
// 开启高亮组件或用
query.setHighlight(true);
// 高亮字段
query.addHighlightField(QUESTION_CONTENT);
//标记,高亮关键字前缀
query.setHighlightSimplePre("");
//后缀
query.setHighlightSimplePost("");
//执行查询
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 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();
}
好了小编的实战关于添加查询删除就先写到这里了。这个是一个借口用的会后直接调用就好了。