




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、搜索引擎Lucene第一章Lucene簡介Lucene是apache軟件基金會 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便的在目標系統(tǒng)中實現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎。第二章lucene索引的建立2.1Lucene的五個基礎(chǔ)類索引的建立,Lucene 提供了五個基礎(chǔ)類,分別是 Document, Field, IndexWriter,
2、Analyzer, Directory。以下是他們的用途:l DocumentDocument的含義為文檔,在Lucene中,它代表一種邏輯文件。Lucene本身無法對物理文件建立索引,而只能識別并處理Document的類型文件。Lucene從Document取出相關(guān)的數(shù)據(jù)源并根據(jù)屬性配置進行相應的處理。l Field對象是用來描述一個文檔的某個屬性的lucene中的field也具有一些特定的類型如Field方法/參數(shù)類型Tokenized(編譯器)Indexed(索引)Store(存儲)處理方式與用途Field( String,String,Store.Yes,Index.UN_TOKENI
3、ZED )否是是不分詞,但是需要經(jīng)過建立索引并存儲比如;日期Field( String,String,Store. YES,Index.NO )否否是不索引,只存儲,比如:文件路徑Field( String,String,Store.NO,Index.UN_TOKENIZED )是是否經(jīng)過倒排建立全文檢索,不存儲,比如:檢索以String方式錄入的內(nèi)容文本Field( String,String,Store.Yes,Index.YES )是是是分詞并經(jīng)過倒排建立索引并存儲,比如:標題Field( String,Reader,Store.NO,Index.UN_TOKENIZED )是是否分詞并
4、經(jīng)過倒排建立索引但是不存儲,不用于返回顯示,比如:檢索以reader推薦精選方式錄入的內(nèi)容文本Field( String,byte,Store.YES)否否是只存儲,不索引Field( String,Reader,TermVector)是是否盡力全文索引,不存儲在lucene2.0中,F(xiàn)ield內(nèi)部包含兩個靜態(tài)的內(nèi)部類分別是Store和Index詳細的描述了Field的屬性,它們分別表示Field的儲存方式和索引方式。Store類有3個公有的靜態(tài)屬性:1. Store.NO:表示該Field不需要儲存。2. Store.YES:表示該Field需要儲存。3. Store.COMPRESS:表示
5、使用壓縮方式來保存這個Field的值。Index有4個公有的靜態(tài)屬性:1. Index.NO:表示該Field不需要索引,也就是用戶不需要去查找該Field的值。2. Index.TOKENIZED:表示該Field先被分詞再被索引。3. Index.UN_ TOKENIZED:表示不對該Field進行分詞,但是要對他進行索引,也就是該Field會被用戶查找。4. Index.NO_NORMS:表示對該Field進行索引,但是不使用Analyzer,同時禁止它參加評分,主要是為了減少內(nèi)存的消耗。l Analyzer在一個文檔被索引之前,首先需要對文檔內(nèi)容進行分詞處理,這部分工作就是由 Anal
6、yzer 來做的。Analyzer 類是一個抽象類,它有多個實現(xiàn)。針對不同的語言和應用需要選擇適合的 Analyzer。Analyzer 把分詞后的內(nèi)容交給 IndexWriter 來建立索引。l IndexWriterIndexWriter 是 Lucene 用來創(chuàng)建索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。l Directory這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實現(xiàn),第一個是 FSDirectory,它表示一個存儲在文件系統(tǒng)中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在內(nèi)存當中的索引的位置。
7、2.2建立索引過程2.2.1IndexWrite的初始化在Lucene中,IndexWrite的主要作用是對索引進行創(chuàng)建,加入Document,合并各種索引段,以及控制與索引相關(guān)的各方面,它是Lucene的索引主要操作者。3個公有的構(gòu)造函數(shù):推薦精選要獲得一個IndexWrite的實例,就需要從它的構(gòu)造函數(shù)入手嘗試。具體的構(gòu)造函數(shù)如下:public IndexWrite(String path, Analyzer a, Boolean create)public IndexWrite(File path , Analyzer a, Boolean create)public IndexWrit
8、e(Directory d, Analyzer a, Boolean create)創(chuàng)建新的segments文件,并寫入版本號,修改次數(shù)等信息讀取原來的segments文件,讀出版本號,短信息等Writer對象初始化完畢初始化一個分析器對像,作為參數(shù)傳入write對象傳入建立索引的路徑,即用戶希望將索引建立的位置為該目錄上鎖用戶希望把該索引目錄原來的內(nèi)容刪去嗎?第一個參數(shù)為索引存放路徑,第二個參數(shù)Analyzer為分詞器,第三個參數(shù)是一個Boolean類型的值,這個參數(shù)的含義是:在由第一個參數(shù)所指定的路徑處,刪除原目錄內(nèi)的所有內(nèi)容重新構(gòu)建索引:或是追加新的Document。2.2.2像索引添加
9、文檔IndexWrite準備好以后,就可以想索引目錄中添加Document。IndexWrite提供了很簡單的接口以供開發(fā)人員進行Document的添加:public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)注意:在使用addDocument方法加入所有的Document后,一定要使用IndexWrite的close方法來關(guān)閉索引器,使所有在I/O緩存中的數(shù)據(jù)都寫入到磁盤上,關(guān)閉各種流。這樣才能最終完成索引的建立。如果沒有關(guān)閉,就會發(fā)現(xiàn)索引目錄中內(nèi)除了一個segme
10、nt文件外一無所有。很多初學者在剛開始使用Lucene時經(jīng)常忘記關(guān)閉IndexWrite,這樣會導致索引的數(shù)據(jù)滯留在緩存中,未寫入磁盤,有可能連目錄的鎖也沒有去除。在下次對同一個目錄加入索引文件的時候可能會提示目錄處于鎖定狀態(tài)而造成無法加入文件。推薦精選限制每個Field中詞條的數(shù)量有必要為Lucene限制每個Field內(nèi)可以建立索引的詞條數(shù)。public void setMaxFieldLength(int maxFieldLength)2.3索引過程的優(yōu)化2.3.1合并因子mergeFactor說明:無論是磁盤上創(chuàng)建新segment還是將segment合并,都需要進行磁盤的I/O操作,相對
11、于內(nèi)存的操作來說,這種磁盤I/O操作是比較費時的。因此,當mergeFactor取比較小的值時,內(nèi)存中駐留的文檔數(shù)量較少,向磁盤寫入segment的操作較多,故此時將占用較小的內(nèi)存,但是索引的建立由于I/O操作頻繁所以會比較慢。而當mergeFactor取較大值時,內(nèi)存中駐留的Document數(shù)量較多,向磁盤寫入segemnt的操作較少,故此時將占用較多的內(nèi)存,但索引的建立速度會比較快。maxMergeDocs一個較大的MaxMergeDocs適用于應對大批量的文檔索引建立,而增量式的索引則使用較小的MaxMergeDocs。minMergeDocs當索引將被存到磁盤中時,需要首先保存在內(nèi)存中
12、,minMergeDocs就是用來限制這個內(nèi)存中的文檔數(shù)量的。索引的合并和優(yōu)化2.3.2 FSDirectory 與RAMDirectory對于lucene來說這兩種目錄都可以作為索引的存儲路徑,F(xiàn)SDirectory指的是在文件系統(tǒng)中的一個路徑。當lucene向其中寫入索引時,會直接將索引寫到磁盤上,RAMDirectory是內(nèi)存中的區(qū)域,雖然向其中添加document的過程與使用FSDirectory中的內(nèi)存寫入磁盤,當虛擬機退出后,里面的內(nèi)容也會隨之消失。因此需要將RAMDirectory中的內(nèi)容轉(zhuǎn)移到FSDirectory中。代碼:2.3.3從索引中刪除文檔索引的讀取工具
13、IndexReader刪除推薦精選IndexReader 主要負責對索引的各種讀取和維護工作,如打開一個索引、取得索引中的某個文檔、獲取索引中的總文檔的數(shù)量,甚至從索引中刪除某個文檔。生成實例方法IndexReader reader = IndexReader.open( INDEX_STORE_PATH );方法reader.deleteDocument(0);在luncene的內(nèi)部使用類似回收站的機制來管理Document的刪除,在每個Document被索引中刪除時,它只相當于被扔進了回收站,并未實際刪除。既然是回收站,Lucene提供了undeleteAll()方法實現(xiàn)反刪除。真正的實現(xiàn)
14、從一個索引中刪除文檔需要使用IndexWriter對索引optimize一次,luncene就會重新為每個文檔分配ID值,這樣那些標記為已刪除的Document就真正的被無理刪除了。IndexWriter writer = new IndexWriter( INDEX_STORE_PATH,new StandardAnalyzer(),false );Writer.Optimize();使用Field信息來刪除批量文檔IndexReader的deleteDocuments()方法是一個能批量刪除索引的方法,它刪除索引是按照詞條進行的,也就是說,每個詞條都可以用其所在的Field和
15、他的值來表示。2.3.4 Lucene同步法則開發(fā)人員容易忽略掉同步問題,一旦發(fā)生這種情況,索引的完整性和數(shù)據(jù)的一致性就遇到了挑戰(zhàn)。 write.lockwrite.lock出現(xiàn)在想索引中添加文檔時或?qū)⑽臋n從索引中刪除時,write.Lock會在IndexWrite初始化時創(chuàng)建,然后在調(diào)用IndexWriter的close()方法是被釋放。另外,會在Indexreader使用delete方法刪除文檔時創(chuàng)建,并在調(diào)用IndexReader的close()方法是被釋放。commit.lockcommit.lock主要是與segment合并和讀取操作相關(guān),例如,他出現(xiàn)在I
16、ndexWriter初始化時,但是一旦當segment的信息被讀取完畢,他會立刻被釋放。另外,當調(diào)用IndexWriter的addIndexes()或mergeSegments()方法時,都會生成這個鎖。推薦精選2.3.5 Luncene2.0的新類:IndexModifier類IndexModifier,它集成了IndexWriter的大部分功能和IndexReader中對索引的刪除功能。第三章Lucene的搜索Lucene里與搜索相關(guān)的API多數(shù)被包含在org.apache.lucene.search包中。其中最重要的是IndexSearch類。在Lucene中,所有與搜索相關(guān)的操作都需要
17、用到這個類。3.1IndexSearch的構(gòu)造方法public IndexSearch( String path )throws IOExceptionpublic IndexSearch(Directory directory)throws IOExceptionpublic IndexSearch( IndexReader r )3.2IndexSearch最簡單的使用代碼3.3IndexSearch的多種search方法/search的重載方法void search( Weight weight,Filter filter,HitCollector results )/關(guān)閉searche
18、r,同時也關(guān)閉了IndexReadervoid close()throws IOException/計算索引中包含有指定的一個term信息的文檔量int docFreq( Term term ) throws IOException/計算索引中包含有指定的一組term信息int docFreq( term terms ) throws IOException/返回索引中最大可能具有document的數(shù)量(再加1)推薦精選int maxDoc()throws IOException/search的重載方法TopDocs search( weight weitght,Filter filter,i
19、nt n ) throws IOException/取出索引中id號為i的索引Document docint ithrows IOException;/對查詢進行rewrite,使之成為原子查詢Query rewrite( Query query ) throws IOException/對查詢結(jié)果的權(quán)重進行翻譯Explanation explain( Weight weight,int doc ) throws IOException/Searcha的重載方法TopFiledDocs search(Weight weight, Filter filter,int n,Sort sort )
20、throws IOException注:l Query:表示一次查詢l Hits:表示一次查詢的結(jié)果l Filter:表示對索引中文檔集合的過濾器,它是檢索在某一個文檔集合的子集中進行l(wèi) Sort:對索引的結(jié)果進行排序的工具l HitCollector:對檢索結(jié)果進行選擇的一個工具,并將選擇后的結(jié)果保存在其中l(wèi) Weight:就是”權(quán)重”表示一次查詢時,索引中的某個文檔的重要信息。Hits類詳解Hits類可以幫助取得Lucene搜索的結(jié)果。并且,在Lucene2.0版本的Hits中,還提供了iterator,可以進行遍歷Hits的公共接口/取得當前結(jié)果集的數(shù)量public final int
21、length()/取得結(jié)果集中第n個documentpublic final Document doc( int n ) throws IOException/取得當前結(jié)果集中第n個Document的得分public final score( int n )throws IOException/取得當前結(jié)果集中第n個Document的索引內(nèi)部的id值public final int id( int n ) throws IOException/取得his集合的遍歷對象public Iterator iterator()3.4Lucene內(nèi)建的Query對象Ø TermQuery 詞條
22、搜索通過對某個固定詞條的制定實現(xiàn)檢索索引中存在該詞條的所有文檔Ø BooleanQuery 布爾搜索布爾查詢,由多個子句和子句間的布爾邏輯組成的查詢代碼推薦精選Must和must表示取兩個查詢子句檢索結(jié)果的交集Must和must_not表示查詢的結(jié)果中不能包含must_not所對應的查詢子句的檢索結(jié)果Must 最終結(jié)果Must_not子句的查詢結(jié)果must_not和must_not沒有實際意義,可以理解為兩個子句的檢索結(jié)果都不要。should與 must 、should與 must_notShould是一個比較特殊的約束。當他與must聯(lián)用時,它失去意義。檢索結(jié)果為must子句的檢索
23、結(jié)果。當它與must_not聯(lián)用時,should的功能就與must一樣,就退變成為must和must_not的查詢結(jié)果should和 should 表示一種“或”的關(guān)系,為所有檢索子句的檢索結(jié)果的并集BooleanQuery 對查詢子句是有限制的最大為1024超過這個數(shù)量會拋出TooManyClauses異常。但用戶也可以通過public static void setMaxClauseCount( int maxClauseCount )改變最大數(shù)量Ø RangeQuery 范圍搜索在某些情況下,用戶需要查找一定范圍內(nèi)的文檔。這種范圍可以使時間、日期數(shù)字大小等,RangeQuery
24、 就是來幫助用戶進行這種查找false表示閉區(qū)間true開區(qū)間Ø PrefixQuery 前綴搜索是一種前綴查找,在檢索的時候,常常需要進行某種前綴查找。Ø PhraseQuery 短語搜索推薦精選允許在在詞之間加一個字Ø MultiPhraseQuery 多短語搜索Ø FuzzyQuery 模糊搜索Ø WildcardQuery 通配符搜索Ø SpanQuery 跨度搜索Ø RegxQuery 第三方提供的Query對象第四章 排序和過濾4.1使用score進行自然排序相關(guān)度排序是一種最簡單的排序方式,所謂相關(guān)度就是文檔的
25、得分用法:說明:圖中的排序時按照相關(guān)度自高像低排序,也就是說用戶檢索內(nèi)容最為相近的排在前面通過改變boost值來改變文檔的得分在進行相關(guān)度排序的時候,如果想人為的增加某個文檔的相關(guān)度,使其在搜索結(jié)果中排在更靠前的位置上,則可以使用boostdoc.setBoost(2f);4.2Sort排序sort是Lucene自帶的一個排序工具,通過它,可以方便的對檢索結(jié)果進行排序.在使用它時,需要實例化一個sort對象,并使用Searcher提供的search( Query,Sort )接口來實現(xiàn)。4.2.1Sort的構(gòu)造方法public Sort();/按field進行查詢推薦精選public Sort
26、( String field );/按field進行查詢,reverse false升序 true 降序默認fasepublic Sort( String field,Boolean reverse );/按field數(shù)組進行查詢public Sort( String fields );public Sort( SortField field );public Sort( SortField fields )4.2.2SortFieldSortField實際上是個包裝類型,通過它的包裝可以使Sort類清楚地了解進行排序的Field的各種信息構(gòu)造函數(shù)Public SortField( Strin
27、g field )Public SortField( String field,Boolean reverse )Public SortField( String field ,int type)Public SortField( String field,int type,Boolean reverse )String 類型的是Field的名稱,Boolean升序還是降序,int型的值,用于指定當前Field的值類型 SortField.INT SortField.STRING4.2.3按文檔得分進行排序Sort.RELEVANGEHits hits = searcher.search( q
28、uery, Sort.RELEVANGE )4.2.4按文檔的內(nèi)部id號排序Sort.INDEXORDERHits hits = searcher.search( query, Sort. INDEXORDER)4.2.5按一個或多個Field來排序Sort sort = new Sort();SortField f1 = new SortField( ”bookNumber”,SortField.INT,false );SortField f2 = new SortField( ”publishdate”,SortField.INT,false );Sort.setSort( new Sor
29、tFieldf1,f2 )Hits hits = searcher.search( q,sort )4.3搜索的過濾器搜索時過濾器是一種減少搜索范圍的方式,即使搜索結(jié)果匹配,但是由于文檔已經(jīng)被過濾,所以仍然不會返回給客戶,有了這種特性就可以實現(xiàn)很多功能,比如可以用它來實現(xiàn)一種安全機制,既保護某些文檔無法被檢索到過濾器的基本結(jié)構(gòu)推薦精選Public abstract BitSet bits( IndexReader reader )throws IOException;BitSets是一種“位集合”隊列,這個隊列的每個元素都只有兩種取值,即true或false,lucene以這種值來代表文檔是否
30、被過濾,也就是說,當lucene返回結(jié)果時,會先遍歷BitSet,僅將那些對應值為true的文檔返回。4.3.1RangeFilter 將檢索結(jié)果限定在某個給定的Field值范圍RangeFilte filter = new RangeFilter( “publishdate”,”1970-01-01”,”1990-01-01”,”true”,”true” );Hits hits = search.search( q,filter );4.3.2QueryFilter 在結(jié)果中查詢當一次檢索完畢后,希望能從上一次檢索的結(jié)果集合中進行二次檢索第五章文本分析器5.1空格分詞器5.1.1空格解析器(
31、WhitespaceAnalyzer)空格解析器利用空格將文本中的各個單詞分割解析出來。這種解析器對帶有空格的印歐語系書寫方式的文本都能處理 WhitespaceAnalyzer的結(jié)構(gòu)簡單。如下所示從圖科看出,WhitespaceAnalyzer繼承自Analyzer。在繼承的方法中創(chuàng)建了一個WhitespaceTokenizer實例。大部分解析的分詞功能是由Tokenizer類實現(xiàn)的5.1.2空格分詞器(WhitespaceTokenizer)WhitespaceTokenizer繼承自抽象類CharTokenizer,WhitespaceTokenizer的next方法也繼承自CharTo
32、kenizer類推薦精選5.2標準分詞器5.2.1標準解析器標準解析器依靠標準分次器(StandardTokenizer)將輸入的文本解析為token流。我們對其內(nèi)部有特色的屬性與方法深入剖析。該解析器特有屬性與方法為:屬性;停用表(stopwords)停用表中存放的是一些高頻率出現(xiàn)的英文單詞,中文文字,高頻此信息量小會帶來索引文件增大方法:tokenStream 方法,TokenStream 的層次結(jié)構(gòu)StopFilterProterStemfilterLowerCaseFilterStandardFilterTokenStreamTokenFilterTokenizerCharTokenizerStandardTokenizerletterTokenizerWhitespaceTokenizerLowerCaseTokenizer 標準過濾 轉(zhuǎn)換為小寫字符 去除高頻詞5.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《商業(yè)插畫創(chuàng)意與表現(xiàn)》課件-【2】商業(yè)插畫的發(fā)展歷程
- 《國際市場營銷》課件-第7章 國際市場價格策略
- 瑜伽館改造粉刷施工合同
- 內(nèi)部培訓計劃和實施情況統(tǒng)計表
- 銀行行業(yè)互聯(lián)網(wǎng)金融創(chuàng)新方案
- 企業(yè)中層管理人員培訓方案
- 農(nóng)業(yè)防治病蟲害的方法有哪些
- 三農(nóng)養(yǎng)殖業(yè)技術(shù)手冊
- 基地建設可行性報告
- 跨部門協(xié)同工作活動策劃方案
- 氣管插管操作并發(fā)癥
- 《浙江省建設工程專業(yè)工程師和高級工程師職務任職資格評價條件》
- JT∕T 795-2023 事故汽車修復技術(shù)規(guī)范
- 預防接種門診驗收表4-副本
- 2024年交管12123學法減分考試題庫及完整答案(典優(yōu))
- 數(shù)智時代的AI人才糧倉模型解讀白皮書(2024版)
- (2024年)高中化學校本課程教材《綠色化學》
- 中醫(yī)-血家藥方四物湯
- 2024年北師大版八年級下冊數(shù)學第二章綜合檢測試卷及答案
- 企業(yè)國防動員教育培訓方案
- 必修一第三單元 單元挑戰(zhàn) 探究密碼安全問題課件
評論
0/150
提交評論