創建索引之代碼開發
阿新 • • 發佈:2018-10-14
first mode 調整 結構 commons reset pri .get 邏輯
【創建索引庫】
使用indexwriter對象創建索引。
【實現步驟】
(1)創建一個java工程,並導入jar包。
(2)創建一個indexwriter對象。
1)指定索引庫的存放位置Directory對象。
2)指定一個分析器,對文檔內容進行分析。
(3)創建Document對象
(4)創建filed對象,將field添加到Document對象中。
(5)使用indexwriter對象將Document對象寫入到索引庫,此過程進行索引創建,並將索引和Document對象寫入索引庫。
(6)關閉IndexWriter對象。
FirstLucene.java:
1 package com.itheima.lucene; 2 3 import static org.junit.Assert.*; 4 import java.io.File; 5 import org.apache.commons.io.FileUtils; 6 import org.apache.lucene.analysis.Analyzer; 7 import org.apache.lucene.analysis.TokenStream; 8 import org.apache.lucene.analysis.cjk.CJKAnalyzer;9 import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; 10 import org.apache.lucene.analysis.standard.StandardAnalyzer; 11 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 12 import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; 13 import org.apache.lucene.document.Document;14 import org.apache.lucene.document.Field; 15 import org.apache.lucene.document.Field.Store; 16 import org.apache.lucene.document.LongField; 17 import org.apache.lucene.document.StoredField; 18 import org.apache.lucene.document.TextField; 19 import org.apache.lucene.index.DirectoryReader; 20 import org.apache.lucene.index.IndexReader; 21 import org.apache.lucene.index.IndexWriter; 22 import org.apache.lucene.index.IndexWriterConfig; 23 import org.apache.lucene.index.Term; 24 import org.apache.lucene.search.IndexSearcher; 25 import org.apache.lucene.search.Query; 26 import org.apache.lucene.search.ScoreDoc; 27 import org.apache.lucene.search.TermQuery; 28 import org.apache.lucene.search.TopDocs; 29 import org.apache.lucene.store.Directory; 30 import org.apache.lucene.store.FSDirectory; 31 import org.apache.lucene.store.RAMDirectory; 32 import org.apache.lucene.util.Version; 33 import org.junit.Test; 34 import org.wltea.analyzer.lucene.IKAnalyzer; 35 36 public class FirstLucene { 37 38 // 創建索引 39 @Test 40 public void testIndex() throws Exception { 41 // 第一步:創建一個java工程,並導入jar包。 42 // 第二步:創建一個indexwriter對象。 43 Directory directory = FSDirectory.open(new File("D:\\temp\\index")); 44 // Directory directory = new RAMDirectory();//保存索引到內存中 (內存索引庫) 45 //Analyzer analyzer = new StandardAnalyzer();// 官方推薦 46 Analyzer analyzer = new IKAnalyzer();// 官方推薦 47 IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); 48 IndexWriter indexWriter = new IndexWriter(directory, config); 49 // 1)指定索引庫的存放位置Directory對象 50 // 2)指定一個分析器,對文檔內容進行分析。 51 // 第三步:創建field對象,將field添加到document對象中。 52 File f = new File("D:\\Lucene&solr\\searchsource"); 53 File[] listFiles = f.listFiles(); 54 for (File file : listFiles) { 55 // 第三步:創建document對象。 56 Document document = new Document(); 57 // 文件名稱 58 String file_name = file.getName(); 59 Field fileNameField = new TextField("fileName", file_name, Store.YES); 60 // 文件大小 61 long file_size = FileUtils.sizeOf(file); 62 Field fileSizeField = new LongField("fileSize", file_size, Store.YES); 63 // 文件路徑 64 String file_path = file.getPath(); 65 Field filePathField = new StoredField("filePath", file_path); 66 // 文件內容 67 String file_content = FileUtils.readFileToString(file); 68 Field fileContentField = new TextField("fileContent", file_content, Store.NO); 69 70 document.add(fileNameField); 71 document.add(fileSizeField); 72 document.add(filePathField); 73 document.add(fileContentField); 74 // 第四步:使用indexwriter對象將document對象寫入索引庫,此過程進行索引創建。並將索引和document對象寫入索引庫。 75 indexWriter.addDocument(document); 76 77 } 78 // 第五步:關閉IndexWriter對象。 79 indexWriter.close(); 80 } 81 82 // 搜索索引 83 @Test 84 public void testSearch() throws Exception { 85 // 第一步:創建一個Directory對象,也就是索引庫存放的位置。 86 Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁盤 87 // 第二步:創建一個indexReader對象,需要指定Directory對象。 88 IndexReader indexReader = DirectoryReader.open(directory); 89 // 第三步:創建一個indexsearcher對象,需要指定IndexReader對象 90 IndexSearcher indexSearcher = new IndexSearcher(indexReader); 91 // 第四步:創建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。 92 Query query = new TermQuery(new Term("fileName", "lucene")); 93 // 第五步:執行查詢。 94 TopDocs topDocs = indexSearcher.search(query, 10); 95 // 第六步:返回查詢結果。遍歷查詢結果並輸出。 96 ScoreDoc[] scoreDocs = topDocs.scoreDocs; 97 for (ScoreDoc scoreDoc : scoreDocs) { 98 int doc = scoreDoc.doc; 99 Document document = indexSearcher.doc(doc); 100 // 文件名稱 101 String fileName = document.get("fileName"); 102 System.out.println(fileName); 103 // 文件內容 104 String fileContent = document.get("fileContent"); 105 System.out.println(fileContent); 106 // 文件大小 107 String fileSize = document.get("fileSize"); 108 System.out.println(fileSize); 109 // 文件路徑 110 String filePath = document.get("filePath"); 111 System.out.println(filePath); 112 System.out.println("------------"); 113 } 114 // 第七步:關閉IndexReader對象 115 indexReader.close(); 116 117 } 118 119 // 查看標準分析器的分詞效果 120 @Test 121 public void testTokenStream() throws Exception { 122 // 創建一個標準分析器對象 123 // Analyzer analyzer = new StandardAnalyzer(); 124 // Analyzer analyzer = new CJKAnalyzer(); 125 // Analyzer analyzer = new SmartChineseAnalyzer(); 126 Analyzer analyzer = new IKAnalyzer(); 127 // 獲得tokenStream對象 128 // 第一個參數:域名,可以隨便給一個 129 // 第二個參數:要分析的文本內容 130 // TokenStream tokenStream = analyzer.tokenStream("test", 131 // "The Spring Framework provides a comprehensive programming and configuration model."); 132 TokenStream tokenStream = analyzer.tokenStream("test", 133 "高富帥可以用二維表結構來邏輯表達實現的數據"); 134 // 添加一個引用,可以獲得每個關鍵詞 135 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); 136 // 添加一個偏移量的引用,記錄了關鍵詞的開始位置以及結束位置 137 OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); 138 // 將指針調整到列表的頭部 139 tokenStream.reset(); 140 // 遍歷關鍵詞列表,通過incrementToken方法判斷列表是否結束 141 while (tokenStream.incrementToken()) { 142 // 關鍵詞的起始位置 143 System.out.println("start->" + offsetAttribute.startOffset()); 144 // 取關鍵詞 145 System.out.println(charTermAttribute); 146 // 結束位置 147 System.out.println("end->" + offsetAttribute.endOffset()); 148 } 149 tokenStream.close(); 150 } 151 152 }
創建索引之代碼開發