程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 【Lucene】詳解Lucene全文檢索的信息寫入與讀取

【Lucene】詳解Lucene全文檢索的信息寫入與讀取

編輯:DB2教程

【Lucene】詳解Lucene全文檢索的信息寫入與讀取


Lucene的大致結構圖:

\

信息寫入索引庫的過程:

\

讀取信息的過程:

\

下面是一個向索引庫寫入信息與讀取信息的例子:

 

public void testCreateIndex() throws Exception{
	/**
	 * 1、創建一個student對象,並且把信息存放進去
	 * 2、調用indexWriter的API把數據存放在索引庫中
	 * 3、關閉indexWriter
	 */
	// 創建一個Student對象,並且把信息存放進去
	Student student = new Student();
	student.setId(1L);
	student.setName("張三");
	// 調用indexWriter的API把數據存放在索引庫中
	   /**
		* 創建一個IndexWriter
		*    參數三個 1、索引庫, 指向索引庫的位置  2、分詞器
		*/
	// 創建索引庫
	Directory directory = FSDirectory.open(new File("./indexDir"));
	// 創建分詞器
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
	IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
	// 把一個student對象轉化成document
	Document document = new Document();
	Field idField = new Field("id",student.getId().toString(),Store.YES,Index.NOT_ANALYZED);
	Field nameField = new Field("name",student.getName(),Store.YES,Index.ANALYZED);
	document.add(idField);
	document.add(nameField);
	indexWriter.addDocument(document);
	// 關閉indexWriter
	indexWriter.close();
}

 

public void testSearchIndex() throws Exception{
	/**
	 * 1、創建一個IndexSearch對象
	 * 2、調用search方法進行檢索
	 * 3、輸出內容
	 */
	// 創建一個 IndexSearch對象
	Directory directory = FSDirectory.open(new File("./indexDir"));
	IndexSearcher indexSearcher = new IndexSearcher(directory);
	// 調用search方法進行檢索
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
	QueryParser queryParser = new QueryParser(Version.LUCENE_30,"name",analyzer);
	Query query = queryParser.parse("張");  // 要查找的關鍵詞
	TopDocs topDocs = indexSearcher.search(query, 2);  // 前兩條
	int count = topDocs.totalHits;  // 根據關鍵詞查詢出來的總的記錄數
	ScoreDoc[] scoreDocs = topDocs.scoreDocs;
	List studentList = new ArrayList();
	for(ScoreDoc scoreDoc:scoreDocs){
		float score = scoreDoc.score;  // 關鍵詞得分
		int index = scoreDoc.doc;  // 索引的下標
		Document document = indexSearcher.doc(index);
		// 把document轉化成Student
		Student student = new  Student();
		student.setId(Long.parseLong(document.get("id")));  // document.getField("id").stringValue()
		student.setTitle(document.get("name"));
		studentList.add(student);
	}
	 
	for(Student student:studentList){
		System.out.println(student.getId());
		System.out.println(student.getName());
	}
}

說明: 1、索引庫的增、刪、改是由indexWriter來操作的 2、同一個時刻內,同一個索引庫,只能允許一個indexWriter操作 3、當IndexWriter創建完成以後,indexwriter所指向的索引庫就被占領了,只有當indexWriter.close時,才能釋放鎖的資源 4、當一個新的indexWriter想擁有索引庫時,原來的indexWriter必須釋放鎖 5、只要索引庫中存在write.lock文件,說明上鎖了 6、indexWriter.close有兩層含義:1. 關閉IO資源; 2.釋放鎖
文件索引庫和內存索引庫的結合 : 1、能不能設置很多個索引庫 可以設置很多個索引庫 2、索引庫能不能合並起來 如果是內存索引庫 Directory ramDirectory = new RamDirectory(Directory d); 這樣就可以把一個索引庫放入到內存索引庫中 利用IndexWriter.addIndexesNoOptimize方法可以把很多個索引庫進行合並操作 3、應用程序能不能在內存中和索引庫進行交互

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved