Lucene建立索引流程

mosterRan發表於2018-04-04

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

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

相關文章