lucene學習筆記一(初始lucene)

lucene簡介:

摘自百科:Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文檢索引擎。Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,可以作全文索引和搜尋。 java

lucene開發的步驟:

  1. 建立索引    

    • 建立Directory apache

    • 建立IndexWriter 架構

    • 建立Document對象 eclipse

    • 爲Document添加Field maven

    • 經過IndexWriter添加文檔到索引中 工具

    • 關閉IndexWriter 測試

  2. 搜索

    • 建立Directory spa

    • 建立IndexReader 開放源代碼

    • 根據IndexReader建立IndexSearcher code

    • 建立搜索的Query

    • 根據searcher搜索並返回TopDocs

    • 根據topDocs獲取ScoreDoc對象

    • 根據searcher和StoreDoc對象獲取具體的Document對象

    • 根據Document對象獲取須要的值

    • 關閉IndexReader

    一個最簡單的lucene例子

    說明:該例子採用lucene5.3,主要功能就是在硬盤上的3個txt文件裏面找到你查詢的字符,並打印出文件名和文件路徑.

    首先,在個人電腦D盤,建立一個文件夾,用來保存lucene檢索的文件的地方.而後建立3個文件用來存放字符串,a.txt,b.txt,c.txt,裏面分別錄入一些字符.下面是個人例子中的圖:


    接着,咱們打開eclipse建立一個maven項目.加入lucene和junit的依賴jar

    <dependencies>
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.10</version>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.lucene</groupId>
    			<artifactId>lucene-core</artifactId>
    			<version>5.3.1</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.lucene</groupId>
    			<artifactId>lucene-analyzers-common</artifactId>
    			<version>5.3.1</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.lucene</groupId>
    			<artifactId>lucene-queryparser</artifactId>
    			<version>5.3.1</version>
    		</dependency>
    	</dependencies>
    package com.kkrgwbj.demolucene;
    
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.store.NoLockFactory;
    
    public class HelloLucene {
    	/**
    	 * 創建索引
    	 */
    	public void index() {
    		// 1.建立Directory
    		Directory directory = null;
    		try {
    			directory = FSDirectory.open(new File("D:/workspace/lucene/index01").toPath(), NoLockFactory.INSTANCE);// 創建在硬盤
    			// directory = new RAMDirectory();//創建在內存中
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    		// 2.建立IndexWriter
    		IndexWriterConfig ic = new IndexWriterConfig(new StandardAnalyzer());
    		IndexWriter iw = null;
    		try {
    			iw = new IndexWriter(directory, ic);
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    		try {
    			// 3.建立Document對象
    			Document doc = null;
    			// 4.爲Document添加Field
    			File f = new File("D:/workspace/lucene");
    			for (File item : f.listFiles()) {
    				if (item.isDirectory()) {
    					continue;
    				}
    				doc = new Document();
    				doc.getFields().add(new TextField("content", new FileReader(item)));
    				doc.getFields().add(new TextField("filename", item.getName(), Field.Store.YES));
    				doc.getFields().add(new TextField("path", item.getAbsolutePath(), Field.Store.YES));
    				// 5.經過IndexWriter添加文檔到索引中
    				iw.addDocument(doc);
    			}
    
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			// 關閉
    			if (iw != null)
    				try {
    					iw.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    		}
    	}
    
    	/**
    	 * 搜索
    	 */
    	public void searcher() {
    		// 1.建立Directory
    		Directory directory = null;
    		IndexReader ir = null;
    		try {
    			directory = FSDirectory.open(new File("D:/workspace/lucene/index01").toPath());// 創建在硬盤
    			// directory = new RAMDirectory();//創建在內存中
    			// 2.建立IndexReader
    			ir = DirectoryReader.open(directory);
    			// 3.根據IndexReader建立IndexSearcher
    			IndexSearcher is = new IndexSearcher(ir);
    			// 4.建立搜索的Query,建立parser來肯定搜索文件的內容,第一個參數表示搜索的域
    			QueryParser parser = new QueryParser("content", new StandardAnalyzer());
    			Query query = parser.parse("java");// 搜索含有java內容的文檔
    			// 5.根據searcher搜索並返回TopDocs
    			TopDocs tds = is.search(query, 10);
    			// 6.根據topDocs獲取ScoreDoc對象
    			ScoreDoc[] docs = tds.scoreDocs;
    			for (ScoreDoc scoreDoc : docs) {
    				// 7.根據searcher和StoreDoc對象獲取具體的Document對象
    				Document d = is.doc(scoreDoc.doc);
    				// 8.根據Document對象獲取須要的值
    				System.out.println("文件名:" + d.get("filename") + "路徑:" + d.get("path"));
    			}
    			// 9.關閉reader
    			ir.close();
    		} catch (Exception e1) {
    			e1.printStackTrace();
    		}
    
    	}
    }

    package com.kkrgwbj.demolucene;
    
    import org.junit.Test;
    
    public class TestLucene {
    
    	@Test
    	public void testIndex() {
    		HelloLucene hl = new HelloLucene();
    		hl.index();
    	}
    	@Test
    	public void testSearch(){
    		HelloLucene hl = new HelloLucene();
    		hl.searcher();
    	}
    
    }



    咱們在junit測試:

    首先,執行建立索引.執行完後,咱們會發如今index01目錄建立索引

     接下來,咱們執行檢索,在控制檯打印輸出a,b,c3個文件中,java出如今哪一個文件中,和文件路徑

     

相關文章
相關標籤/搜索