Lucene建立索引流程
阿新 • • 發佈:2018-11-20
原始文件:網際網路上的網頁(爬蟲或蜘蛛)、資料庫中的資料、磁碟上的檔案
建立文件物件(非結構化資料)
文件物件中的屬性不叫屬性現在成為域。
每個 Document 可以有多個 Field ,不同的 Document 可以有不同的 Field,同一個 Document 可以有相同的 Field(域名和域值都相同)。
每個文件都有一個唯一的編號,就是文件id
分析文件
將原始內容包含域的文件,需要再對域中的內容進行分析,分析的過程是經過對原始文件提取單詞、將字母轉為小寫、去除標點符號、去除停用詞等過程生成最終的詞彙單元,可以將詞彙單元理解為一個個單詞。
原文件內容:
Luncene is a Java full-text search engine.
分析後得到的語彙單元:
lucene、java、full、search、engine…
每個單詞叫做一個 Term,不同的域中拆分出來相同的單詞是不同的 Term。Term中包含兩部分一部分是文件的域名,另一部分是單詞的內容。 Term K 域(檔名稱) V spring Term K 域(檔案內容) V spring 剛才兩個Tream不是一個
建立索引
對所有文件分析得出的語彙單元進行建立索引,建立索引的目地是為了搜尋,最終要實現只搜尋被搜尋的語彙單元從而找到 Document(文件)
注意:建立索引是對語彙索引,通過詞語找文件,這種索引的結構叫倒排索引結構。包括索引和文件兩部分,索引即詞彙表,它的規模較小,而文件集合較大。
傳統方式是根據檔案找到該檔案的內容,在檔案內容中匹配搜尋關鍵字,這種方法是順序掃描法,資料量大、搜尋慢
// 建立索引
@Test
public void testIndex() throws Exception {
// 第一步建立一個indexwriter物件
Directory directory = FSDirectory.open(new File("D:\\temp\\index"));
// Directory directory2 = new RAMDirectory();//儲存索引到記憶體中(記憶體索引庫)
//Analyzer analyzer = new StandardAnalyzer();// 官方推薦
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
// 第三步建立Filed域,將field新增到document物件中
File f = new File("D:\\Lucent&solr\\searchsoure");
File[] listFiles = f.listFiles();
for (File file : listFiles) {
// 第二步建立Document物件
Document document = new Document();
// 檔名稱
String file_name = file.getName();
Field fileNameField = new TextField("fileName", file_name, Store.YES);
// 檔案大小
long file_size = FileUtils.sizeOf(file);
Field fileSizeField = new LongField("fileSize", file_size, Store.YES);
// 檔案路徑
String file_path = file.getPath();
Field filePathField = new StoredField("filePath", file_path);
// 檔案內容
String file_content = FileUtils.readFileToString(file);
Field fileContentField = new TextField("fileContent", file_content, Store.NO);
document.add(fileNameField);
document.add(fileSizeField);
document.add(filePathField);
document.add(fileContentField);
// 第四步:使用indexwriter物件將document物件寫入索引庫,此過程進行索引建立。並將索引和document物件寫入索引庫
indexWriter.addDocument(document);
}
// 第五步:關閉IndexWriter物件
indexWriter.close();
}
// 查詢索引
@Test
public void testSearch() throws Exception {
// 第一步:建立一個Directory物件,也就是索引庫存放的位置。
Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁碟硬碟庫
// 第二步:建立一個indexReader物件,需要指定Directory物件。
IndexReader indexReader = DirectoryReader.open(directory);// 流
// 第三步:建立一個indexsearcher物件,需要指定IndexReader物件
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 第四步:建立一個TermQuery物件,指定查詢的域和查詢的關鍵詞。
Query query = new TermQuery(new Term("fileName", "java"));
// 第五步:執行查詢。
TopDocs topDocs = indexSearcher.search(query, 2);
// 第六步:返回查詢結果。遍歷查詢結果並輸出。
ScoreDoc[] scoreDocs = topDocs.scoreDocs;// 文件id
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 檔名稱
String fileName = document.get("fileName");
System.out.println(fileName);
// 檔案內容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
// 檔案大小
String fileSize = document.get("fileSize");
System.out.println(fileSize);
// 檔案路徑
String filePath = document.get("filePath");
System.out.println(filePath);
System.out.println("-----------------");
}
// 第七步:關閉IndexReader物件
indexReader.close();
}