Lucene-建構和安裝基礎示例程式
- 關于本文
- 關于示例程式
- 設定CLASSPATH環境變量
- 使用索引搜尋
- 關于代碼
- 核心代碼
- 索引檔案
- 搜尋索引
關于本文
本文的目标是通過示例程式幫助你快速入門,了解基本的安裝流程,和配置方法。
關于示例
示例程式示範了Lucene各種功能,以及如何嵌入到你的應用中。
設定CLASSPATH環境變量
首先,你需要下載下傳最新的Lucene釋出包,然後解壓到一個目錄中。
然後你會得到四個JAR包: lucene-core-{version}.jar、 lucene-queryparser-{version}.jar、 lucene-analyzers-common-{version}.jar、 lucene-demo-{version}.jar,把四個JAR包放入到CLASSPATH中。
使用索引搜尋
假設你已經正确配置了CLASSPATH環境變量,接着為檔案建立索引。
java org.apache.lucene.demo.IndexFiles -docs {path-to-lucene}
上面的指令生成一個叫index的子目錄,裡面包含了生成了所有Lucene源代碼的索引。
建立完索引之後,通過下面的指令來使用索引搜尋:
java org.apache.lucene.demo.SearchFiles
嘗試搜尋supercalifragilisticexpialidocious,你将會得到無結果,因為Lucene源代碼中沒有這個詞。換一個詞,如string,再試一次。然後得到了很多結果,每頁十條傳回,當然你也可以根據需要要求傳回更多的結果。
關于代碼
本文深入到指令行的背後–源代碼,告訴你核心代碼有哪些,在哪裡,以及功能是什麼,目的是為了使你知道如何在自己應用程式中內建Lucene。
核心代碼
- IndexFiles.java:用于建立一個索引檔案
- SearchFiles.java:用于搜尋索引檔案
索引檔案
上面說到IndexFiles類用于建立索引檔案,下面來看看它是如何做的。
IndexFiles的執行流程:
main()方法解析指令行參數,然後初始化IndexWriter,打開一個Directory,再初始化StandardAnalyzer和IndexWriterConfig。
IndexFiles的指令行參數:
- -index:指定了一個存儲索引檔案的目錄路徑,如果沒有指定-index參數的值,則預設使用相對路徑index,如果目前目錄不存在,則建立一個。在某些平台上,預設index目錄可能是在一個不同的目錄中建立的,如使用者目錄。
- -docs:指定要建立索引為的文檔路徑。
- -update:訓示IndexFiles不要删除那些已經存在的索引檔案,如果沒有這個參數,那麼IndexFiles在建立索引之前首先清空索引檔案。
IndexWriter使用Directory存儲索引資訊,Directory是一個抽象概念,并不一定是指檔案系統上的一個目錄,也可以是RAM或資料庫等。在示例程式中用到的是FSDirectory,它存儲的目的地是檔案系統。
Analyzer是一個處理通道,通過把輸入文本打散成一個個的單詞,然後再在單詞上做進一步的處理,如小寫轉換、同義詞插入、過濾等操作。在示例程式中,使用的是StandardAnalyzer,它使用Unicode文本分隔算法(該算法定義在 Unicode Standard Annex #29中),然後轉換成小寫,并過濾停止詞。Lucene隻提供少數幾種語言的分析器,定義在lucene/analysis/common/src/java/org/apache/lucene/analysis下。
IndexWriterConfig封裝了IndexWriter的所有配置。
當IndexWriter初始化之後,接着調用indexDocs()方法來遞歸建立Document對象,然後再由IndexWriter序列化到檔案中。Document對象是一個簡單的資料對象,表示一個索引檔案。如果使用了-update指令行參數,IndexWriterConifg的OpenMode将會被設定為OpenMode.CREATE_OR_APPEND,進而IndexWriter嘗試根據辨別符查找是否存在舊的索引檔案,如果存在,則更新;如果不存在,則建立。
搜尋索引
SearchFile類由三個元件組成:IndexSearcher、StandardAnalyzer和QueryParser。搜尋用到的分詞器與建立索引時适用的分詞器必須是同一個,才能保證結果正确。QueryParser分析搜尋詞,産生一個查詢對象Query,然後再傳遞給IndexSearcher進行搜尋。
調用SearchFile的search(query,n)方法進行搜尋,命中文檔将按照分數從高到低排序,然後傳回最高的前幾文檔。
知識鍊
Lucene-大綱
參考
Lucene 7.4.0 demo API