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

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

創建索引的過程如下:

索引結構如下:

索引器結構:

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

AddDocument()方法用於添加文檔,delete documents($ TERM)或delete documents(Query)方法用於刪除文檔,並且可以使用updateDocument()方法更新文檔(只需先刪除再添加)。完成添加、刪除和更新文檔後,應該調用close方法。

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

索引閱讀器或索引搜索器只能看到索引打開時的狀態。打開索引後提交到索引的任何提交信息在重新打開之前都不會顯示。

文檔編寫器結構:

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

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

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

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

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

索引創建的調用過程:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標準分析儀:

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