Lucene学习(二)如何创建索引以及搜索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40990836/article/details/87969470

概述

创建索引的话,我就直接使用了死的数据。你们维护索引什么的我给一个思路,大家自己看着来吧,如果你会创建以及搜索的话。我相信你们肯定可以连接数据库对数据库进行索引以及查询。
废话不说了。

如何创建索引

首先创建一个实体类吧!

package com.gss.article.entity.vo;

/**
 * 永无八阿哥
 *
 * @Author:gssznb
 * @Date:Created 2018/12/79:43
 * @Description: 这是一个描述,但是我可能不会写
 * @Modified By:
 */
public class JcShopArticleEntityVo {

    private Integer docId;

    private String articleId;

    private String title;

    private String date;


    public JcShopArticleEntityVo() {
    }

    public JcShopArticleEntityVo(Integer docId, String articleId, String title, String date) {
        this.docId = docId;
        this.articleId = articleId;
        this.title = title;
        this.date = date;
    }
    // 。。。 省略get/set方法了
}

创建索引类

public class LuceneUtil{
    private static final Logger log = LoggerFactory.getLogger(LucenneUtil.class);
    // 这个是lucene索引保存的路径,可以自己创建个路径 添加进来。
    private static final String INDEX_PATH = "C:\\Users\\gssznb\\Desktop\\lucene1";

    // 私有化构造方法,无法创建对象
    private LucenneUtil() {
    }
    
    /**
     * @param analyzer 分词器,根据需要创建的分词器
     * @return
     * @Descirption 创建写入索引的对象
     * 我这边传入的是Analyzer这个接口,也就是说你只要是分词器都会实现这个接口。
     */
    public static IndexWriter getIndexWriter(Analyzer analyzer) {
        // 得到索引所在目录的的路径
        try {
            FSDirectory directory = FSDirectory.open(Paths.get(INDEX_PATH));
            // 保存用于创建IndexWriter的所有配置
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
            // 实例化IndexWriter
            return new IndexWriter(directory, indexWriterConfig);
        } catch (IOException e) {
            e.printStackTrace(System.out);
            log.info(e.getMessage());
            return null;
        }
    }
    
     /**
     * @param writer 创建的写索引对象
     * @throws IOException 关闭索引时抛出的异常
     * @Description 关闭写索引
     */
    public static void close(IndexWriter writer) throws IOException {
        writer.close();
    }
    
    
    /**
     * @param model 传入的模型类,来制作文档索引。
     * @return 返回一个文档。
     * @Description 用来创建文档。
     */
    public static void writeDocument(JcShopArticleEntityVo model, IndexWriter writer) {
        // 创建一个需要写入的文档
        Document doc = new Document();
        // 将字段和值以及是否储存添加到文档中。
        // TextField是对字符串的进行分词。
        // StringFiled 是不会对这个进行分词。
        doc.add(new LongField("articleId",model.getArticleId(), org.apache.lucene.document.Field.Store.NO));
        doc.add(new TextField("articleTitle",model.getTitle(), org.apache.lucene.document.Field.Store.YES));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format((Date) model.getPublishTime());
        doc.add(new StringField("articleDate",date, org.apache.lucene.document.Field.Store.YES));
        try {
            writer.addDocument(doc);
        } catch (IOException e) {
            e.printStackTrace(System.out);
            log.info("写入失败!");
        }
        try {
            LucenneUtil.close(writer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // 创建索引 不为空 则创建成功!
    public static IndexSearcher getSearch() {
        FSDirectory directory = null;
        try {
            directory = FSDirectory.open(Paths.get(INDEX_PATH));

            DirectoryReader reader = DirectoryReader.open(directory);
            IndexSearcher indexSearcher = new IndexSearcher(reader);
            return indexSearcher;
        } catch (IOException e) {
            e.printStackTrace();
        }
       return null;
    }
    
    // 直接使用main方法来创建
    public static void main(String[] args){
        // 首先创建模拟分词的数据
        JcShopArticleEntityVo vo = new JcShopArticleEntityVo(118L,666L,"一群傻狗","2018-08-26");
        // ... 创建多少个 可以自行看着办 我这边就不多写了。
        // 创建分词器
        SmartChineseAnalyzer analyzer = new SmartChaineseAnalyzer();
        // 创建索引, 将分词器传入获取索引的方法。
        IndexWriter indexWriter = LuceneUtils.getIndexWriter(analyzer);
        // 写入数据直接调用方法
        LuceneUtils.writeDocument(vo,indexWriter);
        // 这样就算创建好索引库了。
    }
    
        // 搜索
        public static void main(String[] args){
        // 获取搜索索引的对象
        IndexSearcher indexSearch = LuceneUtil.getSearch();
        // 创建分词器
        SmartChineseAnalyzer analyzer = new SmartChaineseAnalyzer();
        // 
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40990836/article/details/87969470