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; } } }
相关文章推荐
- Apache Lucene(全文检索引擎)—分词器
- Spring.net整合Lucene.net 实现全文检索(附例程)
- 全文检索之lucene的优化篇--增删改查
- SpringBoot(九) ElasticSearch 全文检索
- 超详细之Spring Boot结合Jest实现对ElasticSearch的全文检索(从mysql导入数据)
- Spring.net整合Lucene.net 实现全文检索(附例程)转载
- Lucene全文检索 之创建索引、增删改查(纯代码)
- 为web项目添加Lucene全文检索功能(Spring集成Lucene)
- 全文检索(二)-基于lucene4.10的增删改查
- 全文检索之lucene的优化篇--增删改查
- java springboot 结合elasticsearch 实现全文检索 的步骤,有坑请绕行
- Apache Lucene(全文检索引擎)—分词器
- Apache Lucene(全文检索引擎)—分词器
- 全文检索(二)-基于lucene4.10的增删改查
- SpringBoot+Lucene第六篇——索引的增删改查
- 基于Lucene.net全文检索
- lucene建立数据库全文检索
- Lucene:基于Java的全文检索引擎简介
- Lucene全文检索基础
- 【Lucene】Apache Lucene全文检索引擎架构之搜索功能