一、索引
索引过程中的核心类:IndexWriter、Directory、Analyzer、Document、Field。
IndexWriter用来写索引。
Directory用来定义索引的目标位置是硬盘上还是内存中。
Analyzer用来分词,常用的分词器有:SimpleAnalyzer,WhitespaceAnalyzer,StandardAnalyzer,StopAnalyzer。分词器里面有个重要的方法tokenStream(),用来获取tokenStream流,这个流中存储了分词的各种信息。首先经过Tokenizer,将待分词字符串拆分成一个个的语汇单元,交给一些列的TokenFilter对这些语汇单元进行处理。
Document用来存储索引信息。
Field用来指定域的名称,一个Document中有多个Field。
二、检索
搜索过程中的核心类:IndexReader、IndexSearcher、Term、Query、TermQuery、TopDocs、ScoreDoc。
IndexReader用来读取索引信息,因为它的开启和关闭比较耗时,所以建议设计成单例的模式。使用open()方法来打开一个IndexReader对象,或者使用openIfChanged()打开一个更新的IndexReader对象。
IndexSearcher用来查询索引,我们通过IndexReader来获取IndexSearcher。
Term用来指定某个域为某个值,它是检索过程中最小的单位,。
Query用来查询,它下面有很多的子类,
TermQuery用来对字符串进行查询,是Query的子类。
TopDocs用来存储IndexSearcher对象查询到的文本信息。
ScoreDoc用来提供一些属性,比如scoreDoc.doc表示文档的docID,将这个ID传给IndexSearcher对象的doc()方法,就可以获得Document对象了,有了Document对象之后,就可以使用get获取其中的值了,其中Store.YES的就会被保存,Store.NO就不会被保存了。
三、分词
分词过程中的核心类:Analyzer、TokenStream、Tokenizer、TokenFilter。
在分词过程中,很多数据是通过Attribute来保存的。如果要获取某个Attribute,就要在遍历流之前,将Attribute添加到流中。了解了这些属性之后,根据原理写一个停用词分词器和同义词分词器。