如何使用15美元每月的機器實現百萬文件檢索

2021-06-22 02:52:14 字數 2367 閱讀 9459

摘要:有了對搜尋產品足夠深入地了解,再進行一些實驗,從廉價的硬體中獲得高效能是完全可能的,我們完全可以避免對saas的依賴,從而節省大量的費用。了解系統的內部原理也能在你向saas平台轉移時,幫助你作出正確的決定。

【編者按】如何在廉價機器上執行乙個超過300萬份文件的搜尋?雲計算時代,託管搜尋服務很受歡迎,但實際上並不是經濟的選擇,而且也不一定能有效解決問題,solr是乙個基於lucene的高效能全文搜尋伺服器,採用solr,我們完全可以避免對saas的依賴,通過對搜尋產品進行足夠深入地了解,再進行一些實驗,從廉價硬體中獲得高效能是完全可能的,那怎樣才能實現這個過程?系統整合架構師richard donovan為我們帶來了精彩分析。

以下為譯文:

gwittr以twitter搜尋為人所知,同時它還是乙個統計資訊的**,除了提供有關推文及鏈結網頁的擴充套件搜尋,也進行資料的統計分析。這篇文章重點介紹如何在廉價(< $15/月)機器上執行乙個中型、大型搜尋(超過300萬份文件)?

面臨哪些挑戰?

這些優化對solr有效,也同樣適用於任何基於lucene的搜尋引擎,比如elastic search。

把問題扔給雲計算怎麼樣?

在這個雲計算和eaas(everything as a service,一切皆服務)時代,對於那些產品需要搜尋功能的公司,託管搜尋服務很有吸引力。雖然一秒鐘只收幾美分的雲服務聽起來很划算,但是到實際應用中,每個月很容易就會產生數百甚至數千美元的費用。

避免這些費用的方法就是在vanilla硬體或者虛擬機器上執行自己的solr,這不僅可以幫助你節省大量的費用,而且還會幫助你獲得有關搜尋引擎的技能和知識,利用這些技能和知識,可以幫助你進一步節省大量的開支,即使在你要轉用其他搜尋平台的時候,這些知識和技能也是必不可少的。

在gwittr中,我們可以在非常便宜的虛擬機器中執行solr例項,而且我們還可以在沒有太大延遲的前提下,對資料進行相當高階的統計。於此同時,我們需要遵循以下幾個原則。

搜尋不等於儲存

像solr這樣的搜尋引擎不等於資料庫儲存,索引是很重要的,如果你忘了這一點,只將搜尋索引看成記憶體,那就會產生一些風險:

優化#1  將搜尋索引看作是可任意處理、易於重建的資源,因為當你需要引入新的特性時,應用程式需要經常性、大規模重建索引。

確定架構中的所有欄位不通過預設方式儲存,這對使用普通的功能已經足夠了。一般你不需要在solr中儲存文件字段,除非你要使用突出顯示的功能,因為solr在使用一些突出顯示功能時,需要用到文件中的初始文字。你也會想要儲存更多的東西,比如文件識別符號,因為在應用程式**中,你可能會用到文件識別符號將搜尋結果鏈結回記憶體。

solr還提供一套擴充套件的字段索引選項,幫助你進一步簡化索引的過程。

瀏覽vs.搜尋

雖然solr、lucene等一系列產品在市場上被稱為「搜尋引擎」,但實際上,稱它們為優越的瀏覽引擎(具有麵片化(faceting)功能的瀏覽引擎,這也是乙個強有力的賣點)更恰當,相比那些開源資料庫,它們有極好的文字搜尋效能。如果你去了解一下使用者體驗是如何設計的(包括怎樣才能讓web爬蟲看到你的**),除非你是google,如果不是你很有可能會發現:大多數情況下,你的使用者在搜尋關鍵字後還會單擊相關導航功能(麵片(facet)以及類似文件……),至少像gwittr那樣,讓訪客可以看到所有的結果,在沒有輸入任何關鍵字的情況下對資料進行挖掘。

優化#2  在「瀏覽」相關查詢時,最好使用solr的過濾器,而不是在「q」引數中堆砌。solr過濾的文件集被快取,它們沒有進行任何相關性得分的計算,所以,使用它們瀏覽查詢將為你節省寶貴的i/o和cpu週期。

此外,搜尋引擎不會在匹配集中顯示太多的結果頁,顯示的結果頁越多,需要的臨時記憶體就越多,結果獲取的速度也就越慢。就算是google,搜尋的結果最多也不會超出1000頁。

優化#3  在應用程式中加入分頁限制。

優化#4  只請求那些你需要用來顯示結果的字段,從而儘量減少i/o和頻寬。

solr提交不等於rdbms提交

在資料庫中,我們無時不刻不在使用事務和併發機制,在更新操作涉及到許多行或者許多表時,這是確保資料完整性的乙個正確方法,在solr中,「提交」有著迥然不同的語義。

你很有可能已經知道,在solr中沒有所謂的「更新」、「資料完整性外來鍵」或者「多表」,實質上,solr/lucene只是通過索引形式管理日益增長的文件集合。每次新增、更新或刪除乙個文件集合,solr就會向其資料目錄中新增乙個新「段」(一堆檔案),最後段的數量會越來越大。有一種機制可以應對這種情況,這裡就不再贅述。

在solr中,通過乙個searcher物件可以處理所有的搜尋查詢。searcher建立在索引組成的段的集合上。提交在這裡的作用很簡單:「讓solr生成新的searcher,包括新段,並以原子方式用它替換當前searcher。」

mac pro 1 5T記憶體是如何實現的

看到這樣的新聞標題是不是很震撼,甚至懷疑人生,64位機怎麼就可以1.5t記憶體了,自己的系統盤都沒那麼大 你買的普通電腦可能並不能支援你擁有這麼大的記憶體,各種都不支援。而且我們知道windows下的32位機僅支援4g記憶體,超過就是不能載入,因為他要對應某乙個實體地址 當然從硬體上操作的話學過計算...

如何使用STL實現自己的類

list如何排序,公升序和降序?把資料加進list中之後,要排序就簡單了,就呼叫它的sort 函式就行了,例如 listlst lst.push back 1 lst.push front 2 lst.push back 5 lst.sort 這樣的話,lst裡本來是2 1 5的順序排列的,sort...

如何使用C C 實現檔案的檢索 ?

要求 1.列出乙個資料夾 2.列出該資料夾下的子資料夾的名稱,檔案的名稱及大小。include include include using namespace std typedef struct win32 find data win32 find data,pwin32 find data 遞迴...