2011-02-09 140 views
1

我們有一個數據庫,我們希望用Sphinx搜索引擎進行索引。問題是Sphinx需要每個文檔的整數ID,但是我們的數據庫有GUID(實際上是隨機的GUID類型的字符串)作爲主鍵。我可以在飛行中生成合成ID as described in this recipe,但僅適用於完整索引。如果我想要增量索引或運行時索引,該怎麼辦?是否有任何最佳實踐來處理使用Sphinx的GUID,它們可以處理增量索引和運行時索引?有問題的數據庫會很大,所以我不想經常重新索引它們。獅身人面像和GUID

回答

9

實時索引:您可以將非數字GUID轉換爲一個數值(可以使用CRC32或MD5澆鑄爲數字)這樣的:

mysql> select conv(mid(md5('abc'), 1, 16), 16, 10); 
+--------------------------------------+ 
| conv(mid(md5('abc'), 1, 16), 16, 10) | 
+--------------------------------------+ 
| 10376663631224000432     | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

測試或谷歌圖什麼算法會減少碰撞。

一旦你有數字標識,你可以將你的文檔插入到Sphinx RT索引中。

增量索引:您可以使用上述相同的方法將GUID轉換爲數字,但您必須記住索引的主要部分完成構建增量的某處。如果表中有一些「更新」或「插入」字段,可以輕鬆完成。 sql_query_range將會像「select ... where updated>(從sphinx_helper選擇last_updated)」一樣。在這種情況下,你不能基於ID,因爲它們不是順序的。

我測試的MD5算法中的一半上11.8M不同的結構域:

mysql> update domain_tmp set hash = conv(mid(md5(domain), 1, 16), 16, 10); 
Query OK, 5901483 rows affected (1 min 59.03 sec) 
Rows matched: 11800403 Changed: 5901483 Warnings: 0 

mysql> select count(*) from domain_tmp; 
+----------+ 
| count(*) | 
+----------+ 
| 11800403 | 
+----------+ 
1 row in set (16.30 sec) 

mysql> select count(distinct hash) from domain_tmp; 
+----------------------+ 
| count(distinct hash) | 
+----------------------+ 
|    11800403 | 
+----------------------+ 
1 row in set (1 min 5.51 sec) 

即沒有衝突發生。所以如果你的數據集中沒有更多的文檔,應該可以使用md5的一半。

+0

我無法真正改變所有的表結構(數據庫有50多個表結構由ORM類系統生成)來生成新的ID。我可以使用md5方法......但是我很擔心碰撞。 – StasM 2011-02-10 20:29:22