1. 程式人生 > >Lucene建立索引流程

Lucene建立索引流程

原始文件:網際網路上的網頁(爬蟲或蜘蛛)、資料庫中的資料、磁碟上的檔案
建立文件物件(非結構化資料)
文件物件中的屬性不叫屬性現在成為

這裡寫圖片描述
每個 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(); }