Lucene 4.7 教程起步--創建索引

歡迎光臨我的個人網站,CSDN更多以工具文章爲主,個人網站裏會有更多關於編程思維等多方面的文章

http://blog.guaidm.com/shocky

有什麼疑問歡迎溝通:QQ 358391345



..從產品設計css一直做到linux運維的程序猿...  很多技術都是皮毛,各位見諒,只求和大家交流一點小技術,歡迎拍磚!..

TIP: 看了一些回覆,首先謝謝大家支持,知道大家一定也希望學習4.7,也不是不想更新,確實時間有限,同時我在項目中負責很多事情,也很雜,不是專門弄搜索引擎開發的,所以即使學到的也不能保證全面。如果大家有什麼問題,或者具體哪方面的想法可以提一下,我更多是在開發中遇到需要處理的問題,然後總結纔會發佈新博客,也不可能完全花時間像寫教材一樣做哈


Lucene作爲全文所以的不二工具,最新已經到4.7.0,在大學時候玩過一段時間,那時候版本很早,現在4.7.0和原來的語法差距很大了,也沒有專門針對最新版本的書籍,包括國外的博客文章都很少,我神州大地就難覓蹤影了(如果哪位找到了歡迎拍磚,我想看中文教學..官方英文文檔還是有點頭暈的)所以最近開發也算是鍛鍊吧,順便提供一點學習經驗給大家


0.準備工作:

1). Lucene官方API http://lucene.apache.org/core/4_7_0/index.html    

2). 我用到的常用JAR包下載:http://download.csdn.net/detail/yangxy81118/8062269

3). 所用到的jar包

  • lucene-analyzers-common-4.7.0.jar
  • lucene-analyzers-smartcn-4.7.0.jar
  • lucene-core-4.7.0.jar
  • lucene-queryparser-4.7.0.jar

本次先介紹關於創建索引


1. 總步驟
這些都算是基礎了,如果這些都不太明白的請參考其他博客先學習基礎~
//a.從數據源準備索引數據
List<ResultVOFromDB> resultList = getKeyWords();
//b.創建IndexWriter
indexWriter = getIndexWriter();
//c.根據索引數據創建索引
addDoc(indexWriter, resultList);

a. 從數據源準備索引數據
這個就不用多說了,我這裏通用了一個ResultVOFromDB這麼一個數據來表示一個從數據源獲取來的VO對象,比如你從數據庫select來的數據,那肯定就是一個VO的List了

b. 創建IndexWriter
這裏變化比較大,很多之前參考的語法都無法使用,或者被廢棄,或者不推薦了,這裏參考了官方的DEMO

	private IndexWriter getIndexWriter() throws IOException {
		Directory dir = FSDirectory.open(new File(indexBuild));
		//Version操作開始變得非常常見
		//中文分詞器的引入,好像4.7.0對庖丁等第三方分詞器兼容得並不好,可能也是因爲apache對原生的做了一些整合的緣故
		Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_47); 
		//同時引入了IndexWriterConfig對象,封裝了早期版本的一大堆參數
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
		IndexWriter writer = new IndexWriter(dir, config);
		return writer;
	}

c. 根據索引數據創建索引
4.7.0 對Field做了更進一步的封裝,官方DEMO推薦已經不再是原來的new Field然後傳參了,(雖然語法還存在,但是有些已經被廢棄了)具體可以參考org.apache.lucene.document包下的相關Field的類
A field that is indexed butnot tokenized: the entire String value is indexed as a single token. For example this might be used for a'country'field or an'id' field, or any field that you intend to use for sorting or access through the field cache.
這段英文應該不難吧,StringField就是可以被參與索引的(is indexed),但是並不做分詞操作(not tokenized),適合做id或者國家名這種“要麼不對,要麼整個都對”
然後我下面還用到了StoredField(只存不索引),TextField(索引並分詞)

private void addDoc(IndexWriter indexWriter, List<ResultVOFromDB> resultList) throws IOException {
		for (ResultVOFromDB vo : resultList) {
			Document doc = createDoc(vo);
			indexWriter.addDocument(doc);
		}
	}

private Document createDoc(ResultVOFromDB vo) throws UnsupportedEncodingException {
		Document doc = new Document();
//就像有某個商品,查詢結果列表要展示商品的名稱,ID,和跳轉鏈接地址,所以從數據庫取出name,id,url字段
		doc.add(new StringField("name", vo.name, Field.Store.YES));
		doc.add(new StringField("id", vo.id, Field.Store.YES));
		doc.add(new StoredField("url", vo.url));
		
//這個keywords就像博客文章的自定義“關鍵字”,這些字有多個,而且都會做用到索引並且接受分詞操作的,“css學習”會被拆分爲“css”和“學習”
		String[] keys = vo.keywords;
		for (int i = 0; i < keys.length; i++) {
			doc.add(new TextField("keyword", keys[i],Field.Store.YES));
		}
 		
		return doc;
	}

下次繼續奉上Lucene4.7.0 索引查找方面的操作

PS:CSDN的編輯框真的不怎麼樣,發個博客想讓大家看着舒服點,編輯起來太痛苦了




教育培訓,網上報名,在線支付,希望大家支持一下啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章