當前位置:成語大全網 - 漢語詞典 - 搜索引擎Lucene(4):創建索引的過程

搜索引擎Lucene(4):創建索引的過程

創建索引的過程如下:

索引結構如下:

索引器結構:

IndexWriter是通過指定存儲目錄和文檔分析器來構建的,其中direcotry表示索引存儲的位置;分析器指示如何分析文檔的內容;相似度用於對文檔進行歸壹化和評分;IndexWriter類中還有壹些SegmentInfos對象,用於存儲索引片段信息,並在出現故障時回滾。

AddDocument()方法用於添加文檔,delete documents ($ TERM)或deleteDocuments(Query)方法用於刪除文檔,使用updateDocument()方法可以更新壹個文檔(先刪除再添加即可)。當您完成添加、刪除和更新文檔時,您應該調用close方法。

這些修改將被緩沖到內存中,並定期刷新到目錄中(在調用上述方法期間)。自上次刷新操作以來,如果有足夠多的緩存刪除操作(請參見setmaxbuffereddeleterms(int))或足夠多的添加文檔(請參見setMaxBufferedDocs(int)),將觸發刷新操作,以較快的為準。對於添加的文檔,在以下任何情況下都會觸發刷新:文檔的設置RAM緩沖區大小或添加的文檔數量。默認的最大RAM使用量是16M。為了獲得最高的索引效率,您需要使用更大的RAM緩存大小。應該註意的是,刷新處理僅將IndexWriter中的內部緩沖狀態移動到索引中,但是在調用commit()和close()方法之前,IndexReader不會看到這些更改。flush可能會觸發壹個或多個segmentmerges,然後會啟動壹個後臺線程來處理,這樣addDocument的調用就不會中斷。請參考MergeScheduler。

IndexReader或IndexSearcher只能看到索引打開時的狀態。在索引打開後提交給它的任何提交信息在重新打開之前都不會被看到。

文檔編寫器結構:

DocumentsWriter是壹個由IndexWriter調用來處理多個文檔的類。它通過Directory類、Analyzer類和Scorer類提取文檔內容,並將其分解成壹組$ term列表,以生成分段所需的單個數據文件,如$ term頻率、$ term位置和$ term向量,以便segmentMerger將其合並為壹個統壹的分段。

這個類可以接收多個添加的文檔,並將它們直接寫入單個段文件。這比為每個文檔創建壹個片段(使用DocumentWriter)並在這些片段上執行協作處理更有效。

每個添加的文檔都被傳遞給DocConsumer類,該類處理文檔並與索引鏈中的其他使用者交互。某些消費者,如StoredFieldWriter和TermVectorsTermsWriter,提取文檔的摘要並立即將字節寫入“文檔存儲”文件(例如,除了在處理文檔時,他們不會為每個文檔消耗內存RAM)。

其他使用者,如FreqProxTermsWriter和NormsWriter,在內存中緩存字節,僅在創建新段時將它們刷新到磁盤。

壹旦我們分配的RAM緩存用完,或者添加的文檔數量足夠了(此時是否刷新是根據添加的文檔數量而不是RAM的利用率來決定的),我們就會創建壹個真實的段,寫入目錄。

索引創建的調用過程:

目錄對象是文件的平面列表。文件可以在創建時壹次性寫入。文件壹旦創建,就只能在重新打開後用於讀取或刪除操作。並且當同時讀和寫時允許隨機訪問。

FSDirectory類直接將目錄抽象類實現為包含文件的目錄。目錄鎖的實現使用默認的SimpleFSLockFactory,但可以通過兩種方式進行修改,即向getLockFactory()傳遞壹個LockFactory的實例,或者通過調用setLockFactory()方法顯式地公式化LockFactory類。

該目錄將被緩存。對於指定的規範路徑,getDirectory()方法通常返回相同的FSDirectory實例。這使得同步機制能夠在目錄上工作。

RAMDirectory類是內存駐留)目錄抽象類的實現。目錄鎖的實現使用默認的SingleInstanceLockFactory,但是可以通過setLockFactory()方法進行修改。

IndexInput類是從目錄中讀取文件的抽象基類,它是壹個隨機訪問的輸入流,用於所有Lucene索引讀取操作。BufferedIndexInput是帶緩沖區的IndexInput的基本實現。

IndexOutput類是壹個用於將文件寫入目錄的抽象基類,它是壹個隨機訪問的輸出流,用於所有Lucene的索引寫入操作。BufferedIndexOutput是帶緩沖區的IndexOutput的基本實現。RAMOuputStream是內存駐留IndexOutput的實現類。

域索引選項控制是否可以通過反轉索引來搜索文本。

當lucene構建壹個倒排索引時,默認情況下,它會保存實現向量空間模型所需的所有信息。該模型需要計算文檔中出現的$ Term的數量以及它們的外觀(例如,在搜索短語時,這是必要的)。但有時這些字段只用於布爾搜索,並不貢獻相關分數。常見的例子是字段只用於過濾,比如權限過濾和日期過濾。在這種情況下,您可以通過調用字段,讓lucene跳過更改選項的頻率和位置的索引。setommittermfreqandpositions(true)方法。這種方法可以節省壹些索引在磁盤上的存儲空間,也可以加快搜索和過濾過程,但它會悄悄地阻止需要位置信息的搜索,比如阻止PhraseQuery和SpanQuery類的運行。

字段存儲選項用於確定是否需要存儲字段的真實值,以便在後續搜索中返回該值。

Lucene支持將多個不同的值寫入壹個字段。

這種處理是完全可以接受和鼓勵的,因為它是邏輯上具有多個域值的域的自然表示。在lucene內部,每當文檔中出現同名的多域值時,倒排索引和項向量都會邏輯上附加這些詞法單元,具體順序由域的添加順序決定。

文檔和字段的加權操作可以在索引時完成。搜索過程中的加權操作會更加動態,因為每次搜索都可以根據不同的加權因子獨立地進行加權或不加權,但這種策略也可能會消耗更多的CPU效率。可以更靈活地控制搜索期間的動態加權。

默認情況下,所有文檔的權重系數為1.0。通過改變文檔的加權因子,可以影響文檔在索引中的重要性。調整加權操作的API是:setboost(float);

與文檔加權壹樣,您可以加權。當對文檔進行加權時,lucene將使用相同的加權因子對文檔中的字段進行加權。域加權API: field.setboost (fliat)。

Analyzer類構造了壹個用於分析文本的TokenStream對象,因此它代表了壹個從文本中提取組成索引的術語的策略。典型的實現首先創建壹個令牌化器,它將從閱讀器break讀取的字符流分解成原始令牌。那麽可以將壹個或多個TokenFilters應用於這個Tokenizer的輸出。警告:您必須在您的子類中覆蓋該類中定義的方法之壹,否則分析器將進入無限循環。

標準分析儀:

StandardAnalyzer類就是這樣壹個Analyzer類的實現,它使用英文停用詞列表對文本中的詞進行標記化,使用StandardTokenizer類對詞進行分解,並添加StandardFilter、LowerCaseFilter和StopFilter進行處理。