Apache Lucene 作為 Java 平台上最成熟的全文搜尋函式庫,其核心演算法、索引格式、查詢語法持續快速演進。隨著專案需求多元化,開發者紛紛嘗試將 Lucene 移植到 C++、Python、Ruby、C#、Delphi 等語言。然而,Lucene 版本迭代極快(當時 1.4.3 → 1.9/2.0 即將釋出重大變更),如何在資源有限的前提下維持多語言版本的功能同步與相容性,成為核心難題。
「Let Java Lucene be the base and all other ports derive from it.」(讓 Java Lucene 為基礎,所有其他移植版本衍生自它。)
Erik 指出:
| 策略 | 實作方式 | 功能同步性 | 索引相容性 | 維護成本 | 效能 | 代表專案 |
|---|---|---|---|---|---|---|
| 原生重寫 | 目標語言完整重寫核心邏輯 | 極低(滯後數個版本) | 需額外驗證 | 極高 | 接近原生 | CLucene, Lucene4C |
| SWIG 自動綁定 | SWIG 掃描 C/C++ 標頭產生綁定 | 依賴 C++ 版進度 | 依賴 C++ 版 | 中 | 接近原生 | SWIG Lucene |
| GCJ/SWIG/JNI 呼叫 Java 位元碼 | 編譯 Java 類為 .so/.dll,薄綁定層 | 100% 同步 | 天然相容 | 極低 | 略有 JNI 開銷 | PyLucene |
| IKVM.NET | .NET 執行 Java 位元碼 | 100% 同步 | 天然相容 | 低 | JIT 優化後接近原生 | Lucene.NET (舊版) |
Erik 明確建議:不要嘗試原生移植,而是加入 SWIG Lucene 陣營,或參考 PyLucene 架構,透過 JNI/COM/ActiveX 橋接 Java Lucene。對於 Delphi,可考慮:
Java Native Interface (JNI) 配合 Invoking API 在 Delphi 中啟動 JVM 並呼叫 Lucene 類別。J-Integra 或 JavOnet),Delphi 直接呼叫 COM 介面。Lucene 多語言化的核心矛盾在於上游演進速度與下游移植資源的巨大落差。Erik Hatcher 早於 2003 年即洞察:「共享原始碼(位元碼層面)優於共享規格(重寫邏輯)」。今日回顧,PyLucene/IKVM.NET/GraalVM 路線完美驗證了這一論斷。對於新專案,**直接嵌入 JVM 或使用 GraalVM Polyglot API 呼叫 Java Lucene,是成本最低、相容性最強、未來最可持續的選擇**。