自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

3.2.2 创建索引库

索引一般存放在硬盘中的一个路径中。例如,在路径d:/lucene/index下创建索引。

        //索引建立在硬盘上
        Directory directory = FSDirectory.open(new File("d:/lucene/index"));

可以用Lucene提供的API创建和更新索引。在生成索引的过程中涉及几个类,它们之间的关系如图3-4所示。

图3-4 创建索引过程中用到的类

可以通过IndexWriter在指定的索引路径下创建一个新的索引库,IndexWriter位于索引管理包org.apache.lucene.index中。虽然可以这样写:

        org.apache.lucene.index.IndexWriter iw =
              new org.apache.lucene.index.IndexWriter(dir, iwc);

但是为了简化写法,往往使用import关键字导入这个类:

        import org.apache.lucene.index.IndexWriter;

用类似的写法导入其他的类。

不同版本的索引格式不一样。可以按指定的版本号写入索引,例如,如果在项目中导入lucene-core-6.3.0.jar这个jar包,就指定版本号是LUCENE_43:

        static Version matchVersion=Version.LUCENE_43;

写入按词组织的索引时,要指定用哪个类把文档切分成词,Analyzer类实现分词功能。各种文本分析器都是Analyzer的子类。例如,使用标准分析器:

        Analyzer analyzer=new StandardAnalyzer();

有个专门配置IndexWriter参数的类IndexWriterConfig。

        Analyzer analyzer=new StandardAnalyzer();


        IndexWriterConfig iwc=new IndexWriterConfig(analyzer);
        iwc.setOpenMode(OpenMode.CREATE); //总是新建索引

也可以根据指定的目录下是否已经有索引存在,决定是向已有的索引追加文档,还是重新建立索引。根据该文件夹下是否存在索引文件来决定是否追加索引的判断如下:

        boolean createIndex = false;
        String indexDir = "d:/index";
        Directory indexDirectory = FSDirectory.open(new File(indexDir));
        // 该文件夹下是否存在索引文件
        if (! IndexReader.indexExists(indexDirectory)) {
            createIndex = true;
        }
        // 根据createIndex的值来决定是否追加索引

这些只需要一行IndexWriterConfig配置代码:

        iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); //保存已有的索引中的数据

根据索引路径和配置信息创建一个IndexWriter,代码如下:

        //默认create_or_append
        iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE); //总是重新创建索引
        Directory dir =FSDirectory.open(new File(indexPath));
        IndexWriter iw=new IndexWriter(dir, iwc); //指定索引路径和配置信息
        iw.addDocument(doc);
        iw.close();

如果有多个索引,一般不会放在同一个路径下。除了在可以长期保存的物理路径中,索引库还可以仅在内存中,也就是创建一个位于RAMDirectory的索引。

        Directory dir = new RAMDirectory(); //内存路径
        ndexWriter iw=new IndexWriter(dir, iwc);

在测试分词或索引的时候,可能会用到内存索引。