本系列將深入剖析 Apache Lucene 核心機制,首篇聚焦索引建立全流程。Lucene 作為 Java 生態最成熟的全文檢索函式庫,廣泛應用於 Elasticsearch、Solr 等搜尋平台底層。
Document 物件,每欄位對應 Field(儲存策略、分析策略可配置)。Analyzer 負責文本分詞、過濾停用詞、詞幹提取等。內建 StandardAnalyzer、IKAnalyzer(中文)等,亦可自訂。IndexWriter 核心類別,管理索引寫入、合併、最佳化。關鍵配置:IndexWriterConfig 設定分析器、相似度模型、合併策略。commit() 強制落盤(觸發 fsync),flush() 僅刷新記憶體緩衝區到段檔案。近實時搜尋 (NRT) 依賴 IndexReader 重新開啟或 SearcherManager 管理。// 1. 建立分析器(中文推薦 IKAnalyzer)
Analyzer analyzer = new IKAnalyzer();
// 2. 配置索引寫入器
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
config.setMergePolicy(new LogByteSizeMergePolicy());
// 3. 開啟索引目錄(FSDirectory 或 RAMDirectory)
Directory dir = FSDirectory.open(Paths.get("/path/to/index"));
try (IndexWriter writer = new IndexWriter(dir, config)) {
// 4. 批次建立文件並寫入
for (DataRecord record : dataSource) {
Document doc = new Document();
doc.add(new StringField("id", record.getId(), Field.Store.YES));
doc.add(new TextField("title", record.getTitle(), Field.Store.YES));
doc.add(new TextField("content", record.getContent(), Field.Store.NO));
writer.addDocument(doc);
}
// 5. 提交持久化
writer.commit();
}
MergePolicy 控制。Field.Store.YES 的欄位值儲存於儲存檔,供檢索結果直接讀取。addDocuments)減少 commit 頻率。RAMBufferSizeMB(預設 16MB)控制記憶體緩衝區大小。TieredMergePolicy(預設)平衡寫入/查詢,LogByteSizeMergePolicy 適合大量寫入。forceMerge(1)),僅在唯讀索引階段執行。