由於最近做畢設,需要做乙個商品查詢模組,用到了lucene來做商品索引的查詢,原因為:
1.marks(商品標籤)字段含有多個標籤,當針對某個標籤查詢時,或許只能用like 查詢,這樣的查詢慢!
2.沒用過lucene,想用來測試下效能
可能結果早就顯而易見,但是這次測試我要的是資料,不僅僅是結果,所以別說什麼你們知道答案類似的話~
言歸正傳,我的設計是這樣的:
而,效能對比,對比的就是搜尋條件,是在lucene快,還是直接去mysql快!
我的lucene模組提供了兩種索引方式,
一種是建立索引在檔案中,需要查詢時在索引檔案中去查詢
二是在記憶體中建立索引,需要時直接再記憶體中查詢
由於第二種方式明顯快於第一種(設計第一種的原因是,索引僅僅在記憶體是不夠的,需要持久化,不能每次都重新拉資料再建立索引),所以僅僅是放上測試資料,僅作對比!
說明:1.mysql只有主鍵索引,marks欄位建有索引,但是通過
explain select * from t_baobei t where t.baobeimarks like '%手' ;
explain select * from t_baobei t where t.baobeimarks like '%手%' ;
explain select * from t_baobei t where t.baobeimarks like '手%' ;
三種情況確認,該sql語句沒有用到索引
2.lucene分詞器用的是
standardanalyzer()
測試1: (1w條資料)
建立索引在檔案中:
index's num is 10000
create use : 1953 ms
search use :
547ms
建立索引在記憶體中:
index's num is 10000
create use : 1046 ms
search use : 94
ms
mysql中:
sql 語句為
select * from t_baobei t where t.baobeimarks like '%手機%'
search use :
16ms --40ms
測試2: (3w條資料)
建立索引在檔案中:
第一次index's num is 30000
create use : 2641 ms
search use : 609ms
第二次
index's num is 30000
create use : 3063 ms
search use : 563ms
第三次index's num is 30000
create use : 3704 ms
search use : 547ms
第四次:刪除已有索引,索引大小3m
index's num is 30000
create use : 2500 ms
search use : 531ms
可以看出:
1.建立索引的耗時隨記錄數的增加而增加,3w條資料的平均耗時為3s以上,資料量是原來的3倍,耗時自是1.5倍
2.從1w到3w,搜尋耗時增加不大
建立索引在記憶體中:
index's num is 30000
create use : 1687 ms
search use : ~94
ms(搜尋'手');
search use : ~110
ms(搜尋'手機');
可以看出:
1.和1w資料在記憶體中建立和搜尋比,資料量是原來的3倍,建立耗時是原來1.5倍,搜尋耗時比本沒有差別
2.和在檔案中建立和搜尋索引比,同樣的資料量(3w),建立耗時減少一半,搜尋耗時,減少乙個數量級!!
3.和mysql 相比四種like方式來說,基本沒有競爭優勢,除最耗時的第一條sql外,其餘mysql均只有lucene的20%
mysql中:
* (30000條資料)
[sql] select * from t_baobei t where t.baobeimarks like '%手%'
[sql] select * from t_baobei t where t.baobeimarks like '手%'
[sql] select * from t_baobei t where t.baobeimarks like '%手機%'
--40ms
[sql] select * from t_baobei t where t.baobeimarks like '手機%'
--40ms
ps: 發現乙個有趣的現象,不同的like方式的寫法,搜尋時間差距這麼大.字元越少,%越多,粒度就越細.耗時越嚴重
大小: 23.6 kb
4 學習Lucene3 5之索引刪除 更新
1 刪除索引 刪除索引 public void deleteindex catch ioexception e finally 2 恢復刪除索引 恢復刪除的索引 從 站 中恢復 public void restoreindex catch ioexception e finally catch io...
Lucene3 5 實現建立索引和搜尋例項
1.資料庫作為資料來源,建立索引 建立索引 public void createindex openmode openmode,listlist catch exception e listlist new persistencefacade query from authors where id ...
Lucene3 5 的索引的建立,刪除,更新,加權
注意 在涉及到刪除,更改之類的改變索引的操作時,要先重新建立一遍索引,然後再執行相關方法才可以看到效果,否則索引仍然是之前的 1.索引的建立 1 第一步先建立模擬的內容,用於建立索引 private string ids private string names private string con...