2009-11-05 48 views
4

我正在構建數據索引,這將需要以(document, term, weight)的形式存儲大量三元組。我將存儲高達幾百萬這樣的行。目前我正在MySQL中做這個簡單的表格。我將文檔和術語標識符存儲爲字符串值,而不是外鍵到其他表。我正在重新編寫軟件並尋找更好的數據存儲方式。看看HBase的工作方式,這似乎很適合架構。我可以將document映射到{term => weight},而不是存儲大量的三元組。HBase是否有意義,如果它沒有在分佈式環境中運行?

我在單個節點上這樣做,所以我不在乎分佈式節點等。我應該堅持使用MySQL,因爲它的工作原理,還是明智的嘗試HBase?我看到Lucene將它用於全文索引(這與我正在做的類似)。我的問題是,單個HBase節點如何與單個MySQL節點進行比較?我來自Scala,所以直接的Java API可以通過JDBC和MySQL解析每個查詢的優勢嗎?

我主要關心的是插入速度,因爲這是以前的瓶頸。處理完後,我最終可能會把數據放回到MySQL中進行實時查詢,因爲我需要做一些在MySQL中更好的計算。

我會嘗試兩種原型,但我相信社區可以給我一些有價值的見解。

+0

什麼是您的插入模式?隨機的,批量的,有序的?在批次插入過程中是否應該關閉鍵?確保使用插入表(...)values(),(),(),(),(),()...(),();所以你不要分析儘可能多的語句,讓文本增長到大約mysql服務器通道限制的大小。 – Don 2009-11-07 02:32:29

+0

插入將是隨機的:我將掃描數十萬個文件,每個文檔產生數百個元組。沒有排序(但我想通過加權頻率從另一端進行排序)。 在我以前的MySQL實現中,是的,我按照您的建議將輸入分爲多個批次。我不記得尺碼,但我嘗試了正確的尺碼。我也做延期插入,因爲在插入時我不關心實時可用的數據。 – Joe 2009-11-07 09:18:21

+0

看過MapReduce之後,這看起來像我可以以不同方式解決的問題(即不是連續寫入表中,而是運行單個批處理),但可能更好。 – Joe 2009-11-07 09:19:06

回答

1

使用正確的工具進行工作。

herehere中選擇了很多反RDBMS或BASE系統(基本可用,軟狀態,最終一致),而不是ACID(原子性,一致性,隔離性和耐久性)。

我已經使用傳統的RDBMS,儘管您可以存儲CLOB/BLOB,但它們並不具有專門用於搜索這些對象的內置索引。

在插入文檔時,您希望完成大部分工作(計算找到的每個元組的 的加權頻率)。

您可能還想在每次搜索後對每個(documentId,searchWord)對的 對進行評分。

這樣你就可以每次都提供更好更好的搜索。

您還希望存儲每個搜索的分數或權重,併爲其他搜索的相似度加權 分數。

很可能某些搜索比其他搜索更爲常見,並且 用戶沒有正確地搜索他們的搜索查詢,儘管他們的意思是 做了一個公共搜索。

插入文檔還應該會對搜索權重 索引進行一些更改。

我越想它,解決方案就越複雜。 你必須先從一個好的設計開始。設計預期的因素越多,結果就越好。

1

MapReduce似乎是生成元組的好方法。如果你能把一個scala作業變成一個jar文件(不確定,因爲我以前沒有用過scala,而且是一個jvm n00b),將它發送並寫一些包裝器來運行它會很簡單在地圖上縮小集羣。

至於在完成之後存儲元組,您還可能想要考慮基於文檔的數據庫,如mongodb,如果您只是存儲元組。

一般來說,這聽起來像你正在做更多的統計與文本...你有沒有考慮過簡單地使用lucene或solr做你在做什麼,而不是寫你自己的?

+0

謝謝,我會遵循這些建議。僅供參考我不是在處理文本,但是這是一個很好的比喻。 – Joe 2009-11-22 17:09:03

相關問題