lucene的開發環境配置,並實現lucene功能一:建立索引;及程式碼示例
1. 配置開發環境
1.1. Lucene下載
Lucene是開發全文檢索功能的工具包,從官方網站下載Lucene4.10.3,並解壓。
版本:lucene4.10.3
Jdk要求:1.7以上
IDE:Eclipse
1.2. 使用的jar包
Lucene包:
lucene-core-4.10.3.jar
lucene-analyzers-common-4.10.3.jar
lucene-queryparser-4.10.3.jar
其它:
commons-io-2.4.jar
junit-4.9.jar
2. 功能一:建立索引庫
使用indexwriter物件建立索引
2.1. 實現步驟
第一步:建立一個
第二步:建立一個indexwriter物件。
1)指定索引庫的存放位置Directory物件
2)指定一個分析器,對文件內容進行分析。
第二步:建立document物件。
第三步:建立field物件,將field新增到document物件中。
第四步:使用indexwriter物件將document物件寫入索引庫,此過程進行索引創建。並將索引和document物件寫入索引庫。
第五步:關閉IndexWriter物件。
2.2. Field域的屬性
是否分析:是否對域的內容進行分詞處理。前提是我們要對域的內容進行查詢。
是否索引:將Field分析後的詞或整個Field
比如:商品名稱、商品簡介分析後進行索引,訂單號、身份證號不用分析但也要索引,這些將來都要作為查詢條件。
是否儲存:將Field值儲存在文件中,儲存在文件中的Field才可以從Document中獲取
比如:商品名稱、訂單號,凡是將來要從Document中獲取的Field都要儲存。
是否儲存的標準:是否要將內容展示給使用者
Field類 |
資料型別 |
Analyzed 是否分析 |
Indexed 是否索引 |
Stored 是否儲存 |
說明 |
StringField(FieldName, FieldValue,Store.YES)) |
字串 |
N |
Y |
Y或N |
這個Field用來構建一個字串Field,但是不會進行分析,會將整個串儲存在索引中,比如(訂單號,姓名等) 是否儲存在文件中用Store.YES或Store.NO決定 |
LongField(FieldName, FieldValue,Store.YES) |
Long型 |
Y |
Y |
Y或N |
這個Field用來構建一個Long數字型Field,進行分析和索引,比如(價格) 是否儲存在文件中用Store.YES或Store.NO決定 |
StoredField(FieldName, FieldValue) |
過載方法,支援多種型別 |
N |
N |
Y |
這個Field用來構建不同型別Field 不分析,不索引,但要Field儲存在文件中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader) |
字串 或 流 |
Y |
Y |
Y或N |
如果是一個Reader, lucene猜測內容比較多,會採用Unstored的策略. |
2.3. 程式碼實現
//建立索引 @Test publicvoid createIndex()throws Exception { //指定索引庫存放的路徑 //D:\temp\0108\index Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index")); //索引庫還可以存放到記憶體中 //Directory directory = new RAMDirectory(); //建立一個標準分析器 Analyzer analyzer = new StandardAnalyzer(); //建立indexwriterCofig物件 //第一個引數: Lucene的版本資訊,可以選擇對應的lucene版本也可以使用LATEST //第二根引數:分析器物件 IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); //建立indexwriter物件 IndexWriter indexWriter =new IndexWriter(directory, config); //原始文件的路徑D:\java\01.課程\04.lucene\01.參考資料\searchsource File dir = new File("D:\\java\\01.課程\\04.lucene\\01.參考資料\\searchsource"); for (File f : dir.listFiles()) { //檔名 String fileName = f.getName(); //檔案內容 String fileContent = FileUtils.readFileToString(f); //檔案路徑 String filePath = f.getPath(); //檔案的大小 long fileSize = FileUtils.sizeOf(f); //建立檔名域 //第一個引數:域的名稱 //第二個引數:域的內容 //第三個引數:是否儲存 Field fileNameField = new TextField("filename", fileName, Store.YES); //檔案內容域 Field fileContentField = new TextField("content", fileContent, Store.YES); //檔案路徑域(不分析、不索引、只儲存) Field filePathField = new StoredField("path", filePath); //檔案大小域 Field fileSizeField = new LongField("size", fileSize, Store.YES); //建立document物件 Document document = new Document(); document.add(fileNameField); document.add(fileContentField); document.add(filePathField); document.add(fileSizeField); //建立索引,並寫入索引庫 indexWriter.addDocument(document); } //關閉indexwriter indexWriter.close(); } |