您的位置:首页 > 编程语言 > Java开发

SpringBoot-Lucene全文检索(标准分词器)增删改查

2019-04-16 14:33 309 查看
IK分词器 (智能中文分词器)
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
@Service
public class LuceneServiceImpl implements LuceneService {

//分词器
private static StandardAnalyzer analyzer = null;
//索引库
private static Directory directory =null;
//分词器工具
private  IndexWriterConfig config = null;
//流
private  IndexWriter indexWriter= null;

static{
try {
//分词器
analyzer = new StandardAnalyzer();
//索引库
directory = FSDirectory.open(Paths.get("E://articlelucenes"));
} catch (Exception e) {
e.printStackTrace();
}
}

@Autowired
private ArticleMapper articleMapper;

/**
* 增加所有数据
* @return
* @throws IOException
*/
@Override
public int addIndexs() throws IOException {

//获取数据
List<Article> list = articleMapper.selectList(null);

ArrayList<Document> documents = new ArrayList<>();

for (Article article:list) {

//提取数据
Integer articleId = article.getArticleId();
String articleName = article.getArticleName();
String articleImage = article.getArticleImage();
String articleContent = article.getArticleContent();

//封装数据
Document document = new Document();
document.add(new TextField("articleId",articleId+"", Field.Store.YES));
document.add(new TextField("articleName",articleName, Field.Store.YES));
document.add(new TextField("articleImage",articleImage, Field.Store.YES));
document.add(new TextField("articleContent",articleContent, Field.Store.YES));
documents.add(document);

}

//工具装配分词器
config = new IndexWriterConfig(analyzer);

//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);

//数据进流
indexWriter.addDocuments(documents);

try {
indexWriter.commit();
return list.size();
}catch (Exception e){
indexWriter.rollback();
return 0;
}finally {
indexWriter.close();
indexWriter= null;
config=null;
}

}

/**
* 增加一条数据
* @param article1
* @return
* @throws IOException
*/
@Override
public boolean addIndexOne(Article article1) throws IOException {

//通过id 获取数据
Article article = articleMapper.selectOne(new QueryWrapper<Article>(article1));

Integer articleId = article.getArticleId();
String articleName = article.getArticleName();
String articleImage = article.getArticleImage();
String articleContent = article.getArticleContent();

//封装数据
Document document = new Document();
document.add(new TextField("articleId",articleId+"", Field.Store.YES));
document.add(new TextField("articleName",articleName, Field.Store.YES));
document.add(new TextField("articleImage",articleImage, Field.Store.YES));
document.add(new TextField("articleContent",articleContent, Field.Store.YES));

//工具装配分词器
config = new IndexWriterConfig(analyzer);
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);

//数据进流
indexWriter.addDocument(document);

try {
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
config=null;
}

}

/**
* 删除索引库所有数据
* @return
* @throws IOException
*/
@Override
public boolean deleteAllIndex() throws IOException {

try {
//工具装配分词器
config = new IndexWriterConfig(analyzer);
//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);

indexWriter.deleteAll();
indexWriter.commit();
return true;
}catch (Exception e){
e.printStackTrace();
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
config=null;
}

}

/**
* 删除索引库中一条数据
* @param article
* @return
* @throws IOException
*/
@Override
public boolean deleteOne(Article article) throws IOException {

//此处数据写死(为了测试)
article.setArticleId(11);
Term term = new Term("articleId", article.getArticleId() + "");

//工具装配分词器
config = new IndexWriterConfig(analyzer);

//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);

try {
indexWriter.deleteDocuments(term);
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
config=null;
}

}

/**
* 修改索引库中一条数据
*     注意:此处修改为  根据查找条件修改  如果有则修改 没有则新添 多条则修改一条
*               (索引库的底层其实做法是 先删除,后修改- -)
* @param article
* @return
* @throws IOException
*/
@Override
public boolean updateOne(Article article) throws IOException {

//此处数据写死(方便测试)
article.setArticleId(11);
article.setArticleName("花花花花花花花花花花花");
article.setArticleImage("9ac3e08c2ee27ad2db304cb979b83724.jpg");
article.setArticleContent("re so so si do si la so la si si si si la si la so");

try {

//工具装配分词器
config = new IndexWriterConfig(analyzer);

//流 读取索引库 加装工具
indexWriter = new IndexWriter(directory,config);

//封装数据
Integer articleId = article.getArticleId();
String articleName = article.getArticleName();
String articleImage = article.getArticleImage();
String articleContent = article.getArticleContent();

Term term = new Term("articleId",articleId+"");

Document document = new Document();
document.add(new TextField("articleId",articleId+"", Field.Store.YES));
document.add(new TextField("articleName",articleName, Field.Store.YES));
document.add(new TextField("articleImage",articleImage, Field.Store.YES));
document.add(new TextField("articleContent",articleContent, Field.Store.YES));

indexWriter.updateDocument(term,document);
indexWriter.commit();
return true;
}catch (Exception e){
indexWriter.rollback();
return false;
}finally {
indexWriter.close();
indexWriter= null;
config=null;
}

}

/**
* 查询索引库的数据(根据输入关键字)
* @param keyword
* @return
* @throws ParseException
* @throws IOException
*/
@Override
public List<Article> queryByKeyword(String keyword) throws ParseException, IOException {

//指定读取索引库的列数据
String[] columns = {"articleId","articleName","articleImage","articleContent"};

//装配
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(columns, analyzer);

//解析输入关键字
Query query = queryParser.parse(keyword);

//读索引库流
IndexReader reader = DirectoryReader.open(directory);

//获得读取对象
IndexSearcher indexSearcher = new IndexSearcher(reader);

//装配解析结果 指定读取量级
TopDocs search = indexSearcher.search(query, 100);

//获得数据地址数组
ScoreDoc[] scoreDocs = search.scoreDocs;

//创建返回集合  --> 方便装配
ArrayList<Article> list = new ArrayList<>();

for (ScoreDoc scoreDoc:scoreDocs){

//获得地址
int i = scoreDoc.doc;

//获得目标对象
Document doc = indexSearcher.doc(i);

//封装数据
Article article = new Article();
article.setArticleId(Integer.parseInt(doc.get("articleId"))
3ff7
);
article.setArticleName(doc.get("articleName"));
article.setArticleImage(doc.get("articleImage"));
article.setArticleContent(doc.get("articleContent"));

//进集合 装配
list.add(article);
}

return list;
}

/**
* 重置索引库 不解释
* @return
* @throws IOException
*/
@Override
public boolean resetIndexDB() throws IOException {

try {
boolean bool = deleteAllIndex();
System.out.println(bool);
int i = addIndexs();
System.out.println(i);
return true;
} catch (Exception e) {
return false;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: