PHP 不直接操作 Lucene 索引,而是透過 PHP Java Bridge 或 exec() 呼叫 Java 類別,由 Java 端封裝 Lucene API 提供 createIndex()、search() 介面。
package TestLucene;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import java.io.*;
public class TxtFileIndexer {
public String createIndex(String indexDir, String dataDir) throws Exception {
File idxDir = new File(indexDir);
File datDir = new File(dataDir);
Analyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(FSDirectory.open(idxDir.toPath()), new IndexWriterConfig(analyzer));
long start = System.currentTimeMillis();
String result = "";
for (File f : datDir.listFiles()) {
if (f.isFile() && f.getName().endsWith(".html")) {
result += "Indexing: " + f.getCanonicalPath() + "<br/>";
Document doc = new Document();
doc.add(new TextField("path", f.getCanonicalPath(), Field.Store.YES));
doc.add(new TextField("contents", new FileReader(f)));
writer.addDocument(doc);
}
}
writer.close();
result += "耗時: " + (System.currentTimeMillis()-start) + "ms";
return result;
}
public String search(String keyword, String indexDir) throws Exception {
File idxDir = new File(indexDir);
if (!idxDir.exists()) return "索引不存在";
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(idxDir.toPath())));
Query query = new TermQuery(new Term("contents", keyword.toLowerCase()));
TopDocs hits = searcher.search(query, 100);
String result = "結果:<br/>";
for (ScoreDoc sd : hits.scoreDocs) {
Document doc = searcher.doc(sd.doc);
result += "<a href='getfile.php?w=" + urlencode(keyword) + "&f=" + urlencode(doc.get("path")) + "'>" + doc.get("path") + "</a><br/>";
}
return result;
}
}
<?php
require_once("https://localhost:8080/JavaBridge/java/Java.inc");
$indexer = new Java("TestLucene.TxtFileIndexer");
echo $indexer->createIndex("/var/lucene/index", "/var/www/html/docs");
echo $indexer->search("關鍵字", "/var/lucene/index");
<?php
$output = shell_exec('java -cp "/path/to/lucene/*:/path/to/classes" TestLucene.TxtFileIndexer createIndex /var/lucene/index /var/www/html/docs');
echo $output;
SmartChineseAnalyzer (Lucene 內建) 或 IKAnalyzer、Jieba 等第三方writer.forceMerge(1)、使用 IndexWriterConfig.setRAMBufferSizeMB(256)IndexSearcher 線程安全可複用、開啟 MMapDirectory (大索引)SearcherManager + ControlledRealTimeReopenThread 實現 NRT (近實時搜尋)elasticsearch/elasticsearchzendframework/zend-search-lucene (Lucene 3.x 移植,效能較弱)跨語言呼叫 Lucene 可行但維護成本高。新專案強烈建議直接採用 Elasticsearch/Meilisearch 等專用搜尋引擎,專注業務開發而非基建整合。