這一章節的學習,主要是學會如何建立索引,使用索引安全
一.建立索引併發
1.從原始文件中提取內容。這裏的文件,能夠是文本文件,也能夠是二進制文件。文本文件(txt),lucene能夠直接處理;而二進制文件(word,pdf等),則可使用Tika框架(Tika是啥,我本身還沒學到,先不細說了)。提取的內容,必須的轉換成lucene能識別的格式並存儲。這裏的格式,就是Field以及由多個Field組成的Document。存儲在Directory對象中。框架
2.光轉換成Document還不能用,lucene還得對Document進行分析,轉換成語彙單元。分析是使用的分析器,即各類Analyzer學習
3.Lucene是安裝倒排索引的方式來存儲分析結果(即語彙單元)的。倒排就是:給定一個語彙單元做爲key,哪些document含有這個key啊?線程
4.創建的索引,存儲在一些有奇怪後綴名的文件中(包括:fdt,fdx,fnm,frq,nrm,prx,tii,tis,tvd,tvf,tvx,segments.gen,segments_一個數字,等等),具體含義看附錄B吧。這也就是書上說的索引段對象
二.使用索引索引
1.向索引中加入文檔:內存
建立IndexWriter對象:IndexWriter writer = new IndexWriter(一個Directory對象,一個分析器對象,一個指定索引存儲Field最大所需內存大小的值)文檔
建立Document對象,並加入Field:Document doc = new Document(); doc.add(new Field(域名,域值,域存儲選項,域索引選項))域名
向索引中加入文檔:writer.addDocument(doc); 最後記得要writer.close();從而才能將索引的變化提交到Directory對象中。
2.刪除索引中的文檔:
注意:這裏刪除的是文檔(即Document),而不是Field。也就是說,刪除的最小單位是Document。而定位要刪除哪一個Document,可使用Term對象或者Query對象。而後使用writer.deleteDocuments(Term對象或者Query對象) 便可
要使得其生效,得writer.commit()或者writer.close();
3.更新索引中的文檔
lucene的更新,實際就是先刪除舊的Document,再添加新的Document。對應方法是:updateDocument(用來匹配舊文檔的Term對象,要更新的新文檔對象,可選的一個分析器對象)。
4.索引中的文檔裏面的域,受到域選項的控制。包括:域索引選項,域存儲選項,域的項向量選項(這個不大理解,先寫在這裏而已);同一個域名還能帶多個域值
5.因爲索引中會有不少文檔,一個文檔中又有不少域。那麼,哪些文檔重要,哪些域重要,就能夠用加權來進行控制。有文檔加權(doc.setBoost(權值))和域加權(field.setboost(權值))。當加權一個文檔時,則文檔中全部域也就跟着加權了。
這裏我有一個疑問:若是一個文檔的權值是1.5;而又給該文檔中的某個field加權爲2.0,那麼,這個特別的field的權值是1.5仍是2.0,仍是別的啥?
6.最後在記錄一個索引的「併發,線程安全及鎖機制」。記住:
A.任意數量的只讀屬性的IndexReader類均可以同時打開一個索引;
B.對於一個索引來講,一次只能打開一個IndexWriter類。當IndexWriter打開一個索引後,就在該索引所在Directory中存放了一個鎖文件(write.lock)。其餘writer就不能再打開咯。
此章節還有一些高級話題,我還沒理解,就先不寫了