1. 程式人生 > >Lucene全文檢索--實戰篇

Lucene全文檢索--實戰篇

一、配置開發環境

版本:lucene4.10.3

Jdk要求:1.7以上

IDE:Eclipse

jar包:

 Lucene包:

   lucene-core-4.10.3.jar

   lucene-analyzers-common-4.10.3.jar

   lucene-queryparser-4.10.3.jar

 其它:

  commons-io-2.4.jar

  junit-4.9.jar

二、建立索引庫

第一步:建立一個java工程,並匯入jar包。

第二步:建立一個indexwriter物件。

  1. 指定索引庫的存放位置Directory物件
  2. 指定一個分析器,對文件內容進行分析。

第二步:建立document物件。

第三步:建立field物件,將field新增到document物件中。

第四步:使用indexwriter物件將document物件寫入索引庫,此過程進行索引建立。並將索引和document物件寫入索引庫。

第五步:關閉IndexWriter物件。

//建立索引
	@Test
	public void createIndex() throws Exception {
		
		//指定索引庫存放的路徑
		Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));
		
		//建立一個標準分析器(分析器有很多種)
		Analyzer analyzer = new StandardAnalyzer();

		//建立indexwriterCofig物件
		//第一個引數: Lucene的版本資訊,可以選擇對應的lucene版本也可以使用LATEST
		//第二根引數:分析器物件
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);

		//建立indexwriter物件
		IndexWriter indexWriter = new IndexWriter(directory, config);

		//原始文件的路徑
		File dir = new File("D:\\04.lucene\\01.參考資料\\searchsource");

		for (File f : dir.listFiles()) {
			//檔名
			String fileName = f.getName();
			//檔案內容
			String fileContent = FileUtils.readFileToString(f);
			//檔案路徑
			String filePath = f.getPath();
			//檔案的大小
			long fileSize  = FileUtils.sizeOf(f);

			//建立檔名域
			//第一個引數:域的名稱
			//第二個引數:域的內容
			//第三個引數:是否儲存
			Field fileNameField = new TextField("filename", fileName, Store.YES);
			//檔案內容域
			Field fileContentField = new TextField("content", fileContent, Store.YES);
			//檔案路徑域(不分析、不索引、只儲存)
			Field filePathField = new StoredField("path", filePath);
			//檔案大小域
			Field fileSizeField = new LongField("size", fileSize, Store.YES);
			
			//建立document物件
			Document document = new Document();
			document.add(fileNameField);
			document.add(fileContentField);
			document.add(filePathField);
			document.add(fileSizeField);
			//建立索引,並寫入索引庫
			indexWriter.addDocument(document);
		}
		//關閉indexwriter
		indexWriter.close();
	}

【注意】Field域的屬性

三、查詢索引庫

  生成的索引檔案,可以使用Luke進行檢視!使用很簡單,這裡面就不做介紹了!

 

四、 查詢索引

第一步:建立一個Directory物件,也就是索引庫存放的位置。

第二步:建立一個indexReader物件,需要指定Directory物件。

第三步:建立一個indexsearcher物件,需要指定IndexReader物件

第四步:建立一個TermQuery物件,指定查詢的域和查詢的關鍵詞。

第五步:執行查詢。

第六步:返回查詢結果。遍歷查詢結果並輸出。

第七步:關閉IndexReader物件

//查詢索引庫
	@Test
	public void searchIndex() throws Exception {

		//指定索引庫存放的路徑
		Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));

		//建立indexReader物件
		IndexReader indexReader = DirectoryReader.open(directory);

		//建立indexsearcher物件
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);

		//建立查詢
		Query query = new TermQuery(new Term("filename", "apache"));

		//執行查詢
		//第一個引數是查詢物件,第二個引數是查詢結果返回的最大值
		TopDocs topDocs = indexSearcher.search(query, 10);

		//查詢結果的總條數
		System.out.println("查詢結果的總條數:"+ topDocs.totalHits);

		//遍歷查詢結果
		//topDocs.scoreDocs儲存了document物件的id
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			//scoreDoc.doc屬性就是document物件的id
			//根據document的id找到document物件
			Document document = indexSearcher.doc(scoreDoc.doc);
			System.out.println(document.get("filename"));
			//System.out.println(document.get("content"));
			System.out.println(document.get("path"));
			System.out.println(document.get("size"));
		}
		//關閉indexreader物件
		indexReader.close();
	}

 【注意】

​​​​​​​   IndexSearcher搜尋方法

​​​​​​​ TopDocs

該部分介紹的查詢比較簡單,後面會介紹複雜查詢! 

五、​​​​​​​索引庫刪除

//刪除全部索引
	@Test
	public void deleteAllIndex() throws Exception {
        //getIndexWriter 詳見上文
		IndexWriter indexWriter = getIndexWriter();
		//刪除全部索引
		indexWriter.deleteAll();
		//關閉indexwriter
		indexWriter.close();
	}
//根據查詢條件刪除索引
	@Test
	public void deleteIndexByQuery() throws Exception {
		IndexWriter indexWriter = getIndexWriter();
		//建立一個查詢條件
		Query query = new TermQuery(new Term("filename", "apache"));
		//根據查詢條件刪除
		indexWriter.deleteDocuments(query);
		//關閉indexwriter
		indexWriter.close();
	}

六、​​​​​​​索引庫的修改

//修改索引庫
	@Test
	public void updateIndex() throws Exception {

		IndexWriter indexWriter = getIndexWriter();

		//建立一個Document物件
		Document document = new Document();

		//向document物件中新增域。
		document.add(new TextField("filename", "要更新的文件", Store.YES));
		document.add(new TextField("content", "2013年11月18日 - Lucene 簡介", Store.YES));

		indexWriter.updateDocument(new Term("content", "java"), document);

		//關閉indexWriter
		indexWriter.close();
	}