package com.boe.cim.teacher.luence;
import java.nio.file.Paths;
import java.util.List;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import com.boe.cim.teacher.pojo.RequirementInfo;
/**
* @author hyh
* @description 创建文档索引
*/
public class LuceneIndexRequirement {
private Directory dir;
/**
*实例化indexerWriter
* @return
* @throws Exception
*/
private IndexWriter getWriter()throws Exception{
//中文分词器
SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer();
IndexWriterConfig iwc=new IndexWriterConfig(analyzer);
IndexWriter writer=new IndexWriter(dir, iwc);
return writer;
}
/**
* 获取indexreDir
* @param indexreDir
* @throws Exception
*/
// public void index(String indexreDir, List<RequirementInfo> listRequirement) throws Exception {
// dir = FSDirectory.open(Paths.get(indexreDir));
// IndexWriterConfig iwc = new IndexWriterConfig(new SmartChineseAnalyzer());
// iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND); // 明确指定打开模式
// try (IndexWriter writer = new IndexWriter(dir, iwc)) {
// for (RequirementInfo requirement : listRequirement) {
// Document doc = new Document();
// doc.add(new StringField("id", String.valueOf(requirement.getId()), Field.Store.YES));
// doc.add(new StringField("requirement", requirement.getRequirement(), Field.Store.YES));
// doc.add(new StringField("department", requirement.getDepartment(), Field.Store.YES));
// doc.add(new StringField("liaisonman", requirement.getLiaisonman(), Field.Store.YES));
// doc.add(new StringField("requirementtype", Integer.toString(requirement.getRequirementtype()), Field.Store.YES));
// doc.add(new TextField("requirementbackground", requirement.getRequirementbackground(), Field.Store.YES));
// doc.add(new TextField("requirementcontents", requirement.getRequirementcontents(), Field.Store.YES));
// writer.updateDocument(new Term("id", String.valueOf(requirement.getId())), doc);
// }
// }
// }
public void index(String indexreDir,List<RequirementInfo> listRequirement)throws Exception{
dir=FSDirectory.open(Paths.get(indexreDir));
IndexWriter writer=getWriter();
writer.commit();
for(int i=0;i<listRequirement.size();i++){
Document doc=new Document();
RequirementInfo requirement = listRequirement.get(i);
//StringField 只索引不分词
doc.add(new StringField("id",String.valueOf(requirement.getId()), Field.Store.YES));
doc.add(new StringField("requirement", requirement.getRequirement(), Field.Store.YES));
doc.add(new StringField("department",requirement.getDepartment(),Field.Store.YES));
doc.add(new StringField("liaisonman", requirement.getLiaisonman(), Field.Store.YES));
doc.add(new StringField("requirementtype", Integer.toString(requirement.getRequirementtype()), Field.Store.YES));
doc.add(new StringField("technicalfield", requirement.getTechnicalfield(), Field.Store.YES));
doc.add(new TextField("requirementbackground", requirement.getRequirementbackground(), Field.Store.YES));
doc.add(new TextField("requirementcontents", requirement.getRequirementcontents(), Field.Store.YES));
// doc.add(new StringField("requirementtype", Integer.toString(requirement.getRequirementtype()), Field.Store.YES));
// doc.add(new TextField("requirementbackground", requirement.getRequirementbackground(), Field.Store.YES));
// doc.add(new TextField("requirementcontents", requirement.getRequirementcontents(), Field.Store.YES));
// writer.deleteDocuments(new Term("id",String.valueOf(teacher.getId())));
writer.updateDocument(new Term("id",String.valueOf(requirement.getId())), doc);
}
writer.close();
}
// public void indexSingleRequirement(String indexreDir, RequirementInfo requirement) throws Exception {
// dir = FSDirectory.open(Paths.get(indexreDir));
// try (IndexWriter writer = getWriter()) {
// Document doc = new Document();
// doc.add(new StringField("id",String.valueOf(requirement.getId()), Field.Store.YES));
// doc.add(new StringField("requirement", requirement.getRequirement(), Field.Store.YES));
// doc.add(new StringField("department",requirement.getDepartment(),Field.Store.YES));
// doc.add(new StringField("liaisonman", requirement.getLiaisonman(), Field.Store.YES));
// doc.add(new StringField("requirementtype", Integer.toString(requirement.getRequirementtype()), Field.Store.YES));
// doc.add(new StringField("technicalfield", requirement.getTechnicalfield(), Field.Store.YES));
// doc.add(new TextField("requirementbackground", requirement.getRequirementbackground(), Field.Store.YES));
// doc.add(new TextField("requirementcontents", requirement.getRequirementcontents(), Field.Store.YES));
// // 添加其他字段...
// writer.updateDocument(new Term("id", String.valueOf(requirement.getId())), doc);
// } // try-with-resources 自动关闭writer
// }
}
package com.boe.cim.teacher.luence;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import com.boe.cim.teacher.dao.TeacherInfoMapper;
import com.boe.cim.teacher.pojo.TeacherInfo;
import com.boe.cim.teacher.dao.RequirementInfoMapper;
import com.boe.cim.teacher.pojo.RequirementInfo;
import com.boe.cim.teacher.utils.FileOperationFunction;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@Order(value=5)
public class StartApplicationWithLuceneIndex implements ApplicationRunner{
@Value("${lucene.index.dir}")
private String IndexDir;
@Autowired
private TeacherInfoMapper teacherInfoMapper;
@Value("${lucenere.indexre.dir}")
private String IndexreDir;
@Autowired
private RequirementInfoMapper requirementInfoMapper;
@Override
@Retryable(value= Exception.class,backoff=@Backoff(delay=2000))
//重试机制,默认重试三次,失败程序启动失败,Main函数run,异常直接捕获不了,因为被aop捕获了
public void run(ApplicationArguments args) {
// TODO Auto-generated method stub
FileOperationFunction.deleteFileFromPath(IndexDir); //有个文件权限太高,删不掉
log.info("生成教师索引文件ing...");
List<TeacherInfo> listTeacher = teacherInfoMapper.userTeacherInfoCreateLuceneIndex();
try {
new LuceneIndex().index(IndexDir,listTeacher);
} catch (Exception e) {
// TODO Auto-generated catch block
}
log.info("生成教师索引文件成功,End");
// TODO Auto-generated method stub
FileOperationFunction.deleteFileFromPath(IndexreDir); //有个文件权限太高,删不掉
log.info("生成需求索引文件ing...");
List<RequirementInfo> listRequirement = requirementInfoMapper.RequirementInfoCreateLuceneIndex();
try {
new LuceneIndexRequirement().index(IndexreDir,listRequirement);
} catch (Exception e) {
// TODO Auto-generated catch block
}
log.info("生成需求索引文件成功,End");
}
@Recover//重试多次皆失败回调方法
public void retryRecover(Exception e) {
log.error("重试三次生成信息索引文件失败...");
log.error(e.getMessage());
}
}
生成的是_0.fdt、_0.fdx