参考
常用相关类、库(基于Lucene 5.4.0)
- Analyzer:
- org.apache.lucene.analysis.core: 常用类库
- org.apache.lucene.analysis.en: 英文库
- org.apache.lucene.analysis.custom: 用户定制类
- org.apache.lucene.analysis.standard: 标准类,经典类
- Tokenizer
- org.apache.lucene.analysis.core.LetterTokenizer: 只取字母
- org.apache.lucene.analysis.core.WhitespaceTokenizer: 只取非空白字符
- TokenFilter
- org.apache.lucene.analysis.core.LowerCaseFilter: 转为小写
- org.apache.lucene.analysis.core.StopFilter: 停用词过滤
- org.apache.lucene.analysis.miscellaneous.LengthFilter: 长度过滤
- org.apache.lucene.analysis.en.PorterStemFilter: 英文词干还原
- MergePolicy:
- org.apache.lucene.index.LogByteSizeMergePolicy:按大小对数合并
- org.apache.lucene.index.LogDocMergePolicy:按文档数目对数合并
- org.apache.lucene.index.TieredMergePolicy(默认):线性合并,不适合大量小文件的索引建立。
原理部分
- StandardAnalyzer 功能太强,因此也太慢,对于普通的英文网页文本而言,可以通过正则式处理标签及标点符号,然后通过WhiteSpaceAnalyzer 进行分析。为了减少索引量,可以进行停用词去除和词干还原。
- 索引合并时,假设有N个同等大小的索引文件,如进行线性合并,则第i个文件需要被后面的索引修改N-i次,一共修改(N-1)+(N-2)+…+1=O(
N2
);如进行对数合并,设N=
2k
,则索引大小由1->2->4->…->
2k
时,一共修改N*(k-1)=O(NlogN)次。因此当N非常大时,采取对数合并很有必要。
//stem, stop reduce index!!
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("WhiteSpace")
.addTokenFilter("PorterStem")
.addTokenFilter("stop")
.build()
// 1. create the index
// Directory index = new RAMDirectory()
Directory index = FSDirectory.open(Paths.get("output/index"))
IndexWriterConfig config = new IndexWriterConfig(analyzer)
//1024,512 out of memory
config.setRAMBufferSizeMB(64)
config.setUseCompoundFile(false)
config.setMaxBufferedDocs(1000)
config.setMergePolicy(new LogDocMergePolicy())
// config.setCommitOnClose(true)
IndexWriter w = new IndexWriter(index, config)