- 自己动手写分布式搜索引擎
- 罗刚
- 647字
- 2020-11-28 15:52:45
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);
在测试分词或索引的时候,可能会用到内存索引。