天天看點

JE上大牛lucene經驗總結

 對lucene感興趣,但沒有實際有實踐環境,隻能根據别人的經驗來總些一些現成的東西。下面是JE壇子裡面大牛lucene經驗。。。。

1一百萬資料記錄,一台伺服器,分布式,前段伺服器通過socket向後端lucene分布式叢集發送索引資料,另後端有搜尋伺服器,提供lucene搜尋服務。索引與搜尋伺服器定時同步。可提供橫向擴充,多應用擴充。沒有遇到問題,測試結果未定

2.第一個項目 目前是80W左右 一台伺服器 Linux 8G記憶體 4核cpu 1T硬碟,轉速中上等

版本2.4遇到的問題,在項目中直跟随伺服器啟動建立索引,比直接寫程式建立索引生成的檔案要大2-3倍暫時沒解決

3.目前是400多W左右 查詢速度1秒到3秒。一台普通電腦 Linux 2G記憶體 4核cpu 500G硬碟,轉速7200

版本3.0

目前遇到的問題是建立過長的文本,會抛出數組越标,隻要截取到3072字元,那就可以順利通過索引。

4.我以前用solr,受限于伺服器硬體和其他地方也要用到資料,是以将索引和資料分開的。

這裡說的索引之隻做index,不做store,唯一儲存的是docid。(分布式還要儲存score,為了合并結果時排序)

使用者請求到索引這裡找到相關docid(這裡是排完序的docid)和相關結果總數,然後再到資料儲存地方拿資料。

資料儲存可以在資料庫或者其他key-value的地方。

通常一個請求會傳回一頁資料,比如10個document,

是以為降低拿資料時引起的io問題,可以将使用者請求的關鍵詞為鍵,docid序列化後為值儲存到memcached。(如果io還是問題突出,那麼cache 高頻率的document或者前幾頁的document)

整個過程的時間是使用者請求到索引中拿到相關docid後。

如果是分布式,,那麼按照最多提供頁面×每個頁面顯示的結果數,将請求并發到不同索引處拿到docid數組,将它合并,然後排序(如果你用php,那麼看下php數組函數,有去重和排序的函數直接使用)。不清楚要自己code的找下(去重,排序)

假如隻做索引,無需考慮壓縮。假如将資料存到資料庫,那麼docid其實是每條記錄主鍵,拿資料是很快的(Sphinx通常是作索引,資料儲存到mysql或者pgsql)

索引劃分一般可以根據業務需要和使用頻繁度來。比如使用者在a版塊隻會查詢a版塊下内容,b版塊隻會查詢b版塊下内容,那麼就按照a,b版塊将索引劃分。

使用頻繁度,通常是新舊兩個搜尋引,新的索引一般存放當天。因為索引東西多了後,commit, optimize的時間會變得很長。不做optimize,搜尋就慢。新索引隻存放一天的,當然比較小,optimize的時間短。

做索引和做搜尋分離:索引和搜尋都很耗資源,如果能放在不同機器完成(solr的解決方案是分離),如果不能分離,那麼在使用頻率很低的時候做索引(一般是午夜)。

搜尋結果排序,一般來說是用lucene自帶的score,也有根據自己業務特點定制score的計算(我當時是自定義score)。品質好壞在于你對業務的了解和相關資料計算的正确性。

 效率:  資料量7600w,,多台伺服器(實在不好意思說那叫伺服器,你可以了解成是P4的pc,跑起來比PIII的品牌伺服器還慢,當時很受google用普通pc的影響),,把爬蟲幹掉後并發不高(能扛下來我覺得挺幸運了),忘記多少了。

查詢速度我記得還行好像是通常的500ms-2秒,,最慢的好像3-4秒(出現頻率很低)

主要做的search優化,索引提速,重寫了solr的同步shell(當時不支援freebsd,我也不會shell,拿本書花了一下午寫得)。

之前是業務資料研究了下,寫了score計算。當時看還行。

比較頭疼的是做索引,我寫shell自動完成,多個索引不同機器做,做完還要切換到search。經常要看看記憶體有沒有out,,隻有一台2g記憶體,其他都是1g記憶體,,

同步是個問題,哪怕隻變化一點點,整個檔案變了。

忘記索引多少G,資料存儲多少G了,,依稀記得很大

5百萬多資料,一台伺服器 Linux 8G記憶體 4核cpu 硬碟轉速中上等,每日pv4萬

使用ehcache做緩存,使用單例模式,分了四個索引,目前運作還可以

5個G你是放在一個索引目下面?單個索引目錄最好不要超過2G

把索引根據id 散列到10個索引目錄下

用ParallelMultiSearcher進行搜尋。

如果已經這樣還是有問題,估計就是你程式寫的有問題了

我現在用到時單機多RMI server,每個server都承載20G的索引。

響應時間都在1s以内,大部分100ms内就傳回結果了。

伺服器的配置比你好,8G + 4cpu*雙核,一台伺服器啟動了四個JVM,一個tomcat+3個RMI Server

單個RMI Server配置設定的伺服器資源我想跟你的應該也差不多

繼續閱讀