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

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")));
            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;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值