Apache Lucene 是「全文檢索引擎架構」,提供索引、查詢、分析三大核心模組,但缺乏爬蟲、分佈式、管理介面等產品級功能。生產環境通常直接使用 Elasticsearch/Solr;學習 Lucene 核心 API 有助於理解上層產品原理。
StandardAnalyzer 適合英文)TermQuery、BooleanQuery、WildcardQuery 等需求:查詢書名同時包含「生」與「記」的文檔。
package LuceneSearch;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import java.io.File;
public class BooleanQueryTest {
static final String INDEX_DIR = "E:/IndexDemo";
public static void main(String[] args) throws Exception {
// 1. 建立索引
try (IndexWriter writer = new IndexWriter(
FSDirectory.open(new File(INDEX_DIR).toPath()),
new StandardAnalyzer(),
IndexWriter.MaxFieldLength.UNLIMITED)) {
String[] books = {"鋼鐵是怎樣煉成的", "英雄兒女", "浮生六記",
"太平廣記", "文化苦旅", "白夜行", "白毛女", "子不語"};
for (String title : books) {
Document doc = new Document();
doc.add(new TextField("bookname", title, Field.Store.YES));
writer.addDocument(doc);
}
System.out.println("索引建立完成,共 " + writer.numDocs() + " 文檔");
}
// 2. 執行布爾查詢
try (IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(INDEX_DIR).toPath())))) {
Term t1 = new Term("bookname", "生");
Term t2 = new Term("bookname", "記");
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(t1), BooleanClause.Occur.MUST);
builder.add(new TermQuery(t2), BooleanClause.Occur.MUST);
BooleanQuery query = builder.build();
TopDocs hits = searcher.search(query, 10);
System.out.println("命中 " + hits.totalHits + " 筆:");
for (ScoreDoc sd : hits.scoreDocs) {
Document d = searcher.doc(sd.doc);
System.out.println(" → " + d.get("bookname"));
}
}
}
}
索引建立完成,共 8 文檔 命中 2 筆: → 浮生六記 → 太平廣記
| Occur | 邏輯 | 說明 |
|---|---|---|
| MUST | AND | 文檔必須匹配該子句 |
| MUST_NOT | NOT | 文檔必須不匹配該子句 |
| SHOULD | OR | 文檔可選匹配;若無 MUST 子句,至少需匹配一個 SHOULD |
組合規則:
SmartChineseAnalyzer 或 IKAnalyzer;forceMerge 優化段合併;QueryParser 解析用戶輸入字串,支援 + - * ? 等豐富語法。