(一)Lucene创建索引步骤

云计算 waitig 509℃ 百度已收录 0评论
public class HelloLucene {
    
    /**
         建立索引

        Field.Store.YES或者NO(存储域选项)
        YES:表示会把这个域中的内容完全存储到文件中,方便进行还原[对于主键,标题可以是这种方式存储]
        NO:表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get())[对于内容而言,没有必要进行存储,可以设置为No]

        Field.index(索引选项)
        Index.ANALYZED:进行分词和索引,适用于标题,内容等
        Index.NOT_ANALYZED:进行索引,但不进行分词,比如身份证号,姓名,ID等,使用于精确搜索
        Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包含了创建索引的时间和权值(排序)等信息
        Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息
        Index.NO:不进行索引

        最佳实践
        NOT_ANALYZED_NOT_NORMS  Store.YES     标识符(主键,文件名),电话号码,身份证号,姓名,日期
        ANALYZED                Store.YES     文档标题和摘要
        ANALYZED                Store.NO      文档正文
        NO                      Store.YES     文档类型,数据库主键(不进行索引)
        NOT_ANALYZED            Store.NO      隐藏关键字

        索引文件结构剖析
        .fnm保存着域字段的信息
        .fdt和.fdx保存着store=yes的数据
        .frq保存着哪些相同的单词出现多少次(可用作排序和评级)
        .nrm专门用来保持一些评级信息
        .tii和.tis保存着索引里面的所有信息

        文档和域的概念
        文档相当于表中的每一条记录,域相当于表中的每一个字段
     */

    public void index(){
        IndexWriter  writer = null;

        try {
            //1、创建Directory(索引位置)
            //Directory directory = new RAMDirectory();//建立在内存中
            final Directory directory = FSDirectory.open(new File("d://lucene/index01"));//创建在硬盘上

            //2、创建IndexWrite(写入索引)
            final IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
            writer = new IndexWriter(directory, config);

            //3、创建Document对象
            Document document = null;

            //4、为Document添加Field(相当于添加属性:类似于表与字段的关系)
            final File file = new File("d://lucene/example");//需要创建索引的文件
            //遍历所有文件
            for(final File f : file.listFiles()){
                document = new Document();
                //将内容添加成索引
                document.add(new Field("content", new FileReader(f)));

                /*
                    Field.Store.YES:将文件的全名存储到索引中,Field.Index.NOT_ANALYZED:不进行分词
                    Store.YES 保存 可以查询 可以打印内容
                    Field storeYes = new Field("storeyes","storeyes",Store.YES,Index.TOKENIZED);
                    Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间
                    Field storeNo = new Field("storeno","storeno",Store.NO,Index.TOKENIZED);
                    Store.COMPRESS 压缩保存 可以查询 可以打印内容 可以节省生成索引文件的空间,
                    Field storeCompress = new Field("storecompress","storecompress",Store.COMPRESS,Index.TOKENIZED);
                    至此,对于理解Store.YES,Store.NO 就是不存储就不能直接获取此字段的内容,存储了就可以。但是两者都可以用于检索。
                 */
                //将文件名称添加成索引
                document.add(new Field("filename", f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));

                //将文件路径添加成索引
                document.add(new Field("path", f.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));

                //5、通过IndexWriter添加文档到索引中
                writer.addDocument(document);
            }
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (LockObtainFailedException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(writer != null){
                try {
                    writer.close();
                    writer = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
            
    }
    

    //测试创建索引
    public static void main(String[] args) {
        HelloLucene hl = new HelloLucene();
        hl.index();
    }

}


本文由【waitig】发表在等英博客
本文固定链接:(一)Lucene创建索引步骤
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)