2010-04-24 53 views
68

我想知道lucene搜索如何快速運行。我在網上找不到任何有用的文檔。如果你有任何東西(缺少lucene源代碼)閱讀,請告訴我。Lucene如何工作

在我的情況下,使用帶索引的mysql5文本搜索的文本搜索查詢大約需要18分鐘。 lucene搜索相同的查詢需要不到一秒的時間。

+1

我可以請求該問題將被轉換爲社會維基? Lucene現在聽起來像是一個平臺。 – asyncwait 2014-03-03 12:40:26

回答

63

Lucene是一個倒置的全文索引。這意味着它將所有文檔分成文字,然後爲每個詞構建索引。由於索引是一個精確的字符串匹配,無序,所以它可能非常快。假設varchar字段上的SQL無序索引可能同樣快,實際上我認爲在這種情況下,您會發現大數據庫可以非常快速地執行簡單的字符串相等查詢。

Lucene不必爲事務處理進行優化。當您添加文檔時,它不需要確保查詢立即。而且它不需要對現有文檔的更新進行優化。

但是,在一天結束時,如果你真的想知道,你需要閱讀源代碼。畢竟,你提到的兩件事都是開源的。

+0

如果我理解正確,文本搜索引擎不同的地方在於它們如何處理多詞搜索並實時將搜索結果加入多個索引。我不會建議諮詢Lucene的源代碼。閱讀一下關於文本搜索理論可能會更好,@ alienCoder的答案幫助了我。 – 2014-04-20 01:18:45

+1

@bmargulies,如果索引是「每個單詞」,那麼爲什麼stackoverflow用戶搜索http://stackoverflow.com/users允許子字符串匹配? – Pacerier 2014-12-07 12:53:47

+1

這不是全書答案的地方。那裏的基本概念有許多詳細的闡述。 – bmargulies 2014-12-07 13:04:52

16

總之:索引。

Lucene爲您的文檔創建索引,使其能夠更快速地進行搜索。

這是列表O(N)數據結構和散列表O(1)數據結構之間的相同差異。該列表必須遍歷整個集合才能找到你想要的東西。散列表有一個索引,它可以確切地確定所需項目的位置並簡單地獲取它。

更新:

我不能確定你的意思是「Lucene索引搜索有很多比MySQL索引搜索速度更快。」

我的猜測是你正在使用MySQL「WHERE文件LIKE'%phrase%'」來搜索文檔。如果這是真的,那麼MySQL必須對每一行執行表掃描,這將是O(N)。

Lucene可以將文檔解析爲令牌,將它們按照您的方向分爲n-gram,然後計算其中每一個的索引。在索引的Lucene文檔中找到一個單詞是O(1)。

+8

是的,我瞭解索引部分,但lucene索引搜索再次比mysql索引搜索快得多。這是怎麼發生的 – Midhat 2010-04-24 19:19:19

21

Lucene創建了一個很大的索引。該索引包含單詞ID,單詞所在文檔的數量以及單詞在這些文檔中的位置。所以當你給一個單詞查詢時,它只是搜索索引(O(1)時間複雜度)。然後使用不同的算法對結果進行排序。對於多字查詢,只需將存在單詞的文件集合交叉即可。因此,Lucene非常快速。

對於由谷歌閱讀這篇文章的詳細信息developers- http://infolab.stanford.edu/~backrub/google.html

+4

在這篇論文中剔除過,它非常有幫助。特別是「4.5搜索」有我正在尋找的答案。具體來說,這聽起來像是一個O(1)散列搜索用於單個單詞,但隨後使用O(n)掃描將結果與40,000個文檔限制結合起來。我假設使用map-reduce算法來分割這個工作,以便用戶獲得即時結果。 – 2014-04-20 01:19:27

+0

一個流行的算法是鴿子排名算法。雖然我不太瞭解它。 – alienCoder 2014-04-20 14:16:26

+2

那篇論文很有趣:「在這篇論文中,我們介紹Google,一個原型......」。我猜Google並不總是一個大型公司。 – Buttons840 2014-07-18 01:17:26