2011-08-23 37 views
5

我有一個mysql數據庫,其中不斷添加大量文本。 (每小時10頁文字)。文本以明文形式存儲在文本字段中。每一行都會聯繫一個或兩個文本。在mysql中搜索大量不斷更新的文本

我需要定期在此數據庫上進行全文搜索(在文本中搜索關鍵字並執行復雜的查詢)。我只需要搜索新添加的文本。但是,添加文本可以立即搜索(一兩分鐘內),這一點非常重要。

從我讀過的,與MySQL的全文是非常低效的。我知道lucene是一個選項,但我不確定它可以多快地索引新文本。

那麼我有什麼選擇?有沒有辦法讓mysql更高效? lucene是我最好的解決方案嗎?什麼更合適?

感謝

回答

2

我已經完成索引時間獅身人面像的基準測試& Solr。與Solr相比,Sphinx在索引算法(超快索引時間和小索引大小)方面遙遙領先。

當你說10頁的文字,它似乎你甚至不需要實時獅身人面像索引。您可以按照Sphinx中的主要+增量索引方案(您可以在Sphinx文檔中找到)。這將是超快和接近實時的。如果您需要更多幫助,請隨時詢問,很高興向您解釋。

Solr是偉大的,但談到優化算法獅身人面像岩石!嘗試獅身人面像。

在評論中提到您的問題,Solr/Lucene支持增量索引(在他們的術語中稱爲delta導入),其安靜易於配置,但與Sphinx使用的方法相比,它們相當慢。

Main + Delta很快就夠了,因爲你可以做的就是創建一個臨時表存儲你的新文本並索引它。根據文檔:Sphinx支持「實時」(幾乎實時)索引更新,並且可以使用所謂的「主+增量」方案來實現。這個想法是設置兩個來源和兩個索引,其中一個爲數據的「主要」索引,另一個爲新文檔的「增量」。

舉個例子,你有1000萬條記錄,所以你可以保留它作爲主索引,並且所有新文檔都被添加到一個新的表中,這個表將作爲三角洲。這個新表格可以不時索引(比如說每1小時),並且數據可以在幾秒鐘內搜索到,因爲您有10頁文本。現在,在您搜索到新記錄後,您可以合併主表+ delta表格的文檔,這可以在不干擾搜索的情況下執行。合併文檔時,清空新表並在一小時後再次執行整個過程。我希望你有其他問題,請隨時提出任何問題。

+0

謝謝你的幫助。從我讀的主+三角洲正是我所需要的。但是有一點在文檔中不明確;他們說它將把索引時間縮短到30到60秒。就我而言,在幾秒鐘內(最多一分鐘)準備好可以搜索新文本是非常重要的。主+三角洲足夠快嗎?從我看到的獅身人面像就是這樣。 – applechief

+0

非常歡迎。你可以在上面看到我編輯的答案。主+三角洲應該爲你工作,因爲獅身人面像索引真的很快。但還有一件事:請看上面答案中提到的獅身人面像中的實時索引,我從來沒有用過它,但看起來很有希望。將兩者都應用於數據後,您可以查看哪些最適合您。 – Yavar

2

你有兩個選擇:

  • Sphinx Search:可以與你的MySQL數據庫直接集成。支持實時索引,有侷限性

  • Solr/Lucene:通過JSON或XML從數據庫中提供數據。具有豐富的查詢功能。目前的版本不是實時的,沒有一些邊緣構建。您必須重新爲您的數據建立索引並將其提交以顯示更改。根據你的數據量,你可以每10分鐘做一次提交。由於Lucene在編制索引時速度非常快,因此這不會成爲問題,直到您擁有100K/1M +文檔。每小時10頁是相當平凡的。

  • ElasticSearch:Java是基於像Solr/Lucene一樣的,但似乎足夠真正的「近實時」。其工程開箱即可分佈並支持線性擴展。您通過JSON提供數據並通過JSON查詢。

這實際上取決於您的需求和能力。獅身人面像可能是最容易入門的。但是它的實時索引限制可能不適合你。

+0

Sphinx和ElasticSearch看起來很有趣。我將研究獅身人面像的實時限制。那麼lucene每次都會對整個數據庫進行重新索引?它不會對其索引進行增量更新嗎?什麼關於shinx和elasticsearch? – applechief

+0

1. ElasticSearch也基於Lucene 2. Lucene可以在新出現的文檔中添加文檔,因此您不必重新編制任何內容,但@Code意味着您需要提供文檔並調用相對昂貴的「提交」操作,以便文檔出現 - 這僅適用於Solr。 Lucene等ElasticSearch不需要昂貴的「提交」3. ElasticSearch非常容易上手...... – Karussell