2011-11-30 112 views
1

後我以前的問題(http://stackoverflow.com/questions/8217522/best-way-to-search-for-partial-words-in-large-mysql-dataset),我'我選擇了Sphinx作爲MySQL數據庫上方的搜索引擎。獅身人面像搜索,複合鍵

我已經做了一些小測試,它看起來不錯。不過,我現在正處於一個地步,我需要一些幫助/意見。我有一個表的文章(結構並不重要),表屬性(結構並不重要),以及每個文章的每個屬性的值(這是它的全部內容)的表。 其中這些值存儲表,具有以下結構:

articleID UNSIGNED INT 
propertyID UNSIGNED INT 
value  VARCHAR(255) 

主鍵是條款ArticleID和屬性ID的化合物鍵。

我希望獅身人面像通過value列進行搜索。但是,要在Sphinx中創建索引,我需要一個唯一的ID。我沒有在這裏。 同樣在搜索時,我希望能夠在propertyID列上進行過濾(例如,只能通過將propertyID定義爲屬性來實現propertyID 2的搜索值)。

在獅身人面像的論壇,我發現我可以創造一個多值屬性,並將其設置爲查詢我的獅身人面像指數:現在不過

SELECT articleID, value, GROUP_CONCAT(propertyID) FROM t1 GROUP BY articleID 

條款ArticleID將是獨一無二的,我現在很想念值。所以我很確定這不是解決方案,對吧?

還有一些其他選項,如:

  • 添加一個額外的列的表,這是唯一
  • 創建查詢計算的獨特價值(如articleID*100000+propertyID

有沒有其他的選擇我可以使用,你會怎麼做?

回答

1

在您的建議

  • 添加一個額外的列的表,這是唯一

這不能與大量的記錄現有的表來完成,添加一個新的領域到大型表格需要一些時間,在此期間數據庫不會響應。

  • 創建查詢計算的獨特價值(諸如articleID * 100000 +物業ID)

如果你這樣做,你必須找到一種方式來獲得從計算出的獨特的條款ArticleID和屬性ID ID。

另一種替代方法是,您可以創建一個新表格,其中包含sphinx的關鍵字段和另外兩個字段來存放articleID和propertyID。

  • new_sphinx_table具有以下字段

    ID - UNSIGNED INT/BIGINT

    條款ArticleID - UNSIGNED INT

    屬性ID - UNSIGNED INT

然後你就可以寫下面的索引查詢

SELECT id, t1.articleID, t1.propertyID, value FROM t1 INNER JOIN new_sphinx_table nt ON t1.articleID = nt.articleID AND t1.propertyID = nt.propertyID; 

這是一個示例,因此您可以修改它以適合您的要求。

什麼sphinx返回匹配new_sphinx_table.id值與其他屬性的列。你可以通過使用new_sphinx_table.id價值觀,而加入您的T1命名錶和new_sphinx_table

+0

Thans爲你解答的結果。如果我創建了一個計算的獨特值,那麼讓這兩個ID回來是可取的。但是這當然不是一個很好的方法...... –

+0

如果你這樣做,你需要一個字段2 *(INT)大小的字段來存儲數據庫中的組合鍵值,否則無論何時重新索引數據庫,都必須重新計算它。想想你計劃每天重新索引DB一次,DB表包含100000條記錄,所以計算成本會更高。而用戶的未來增長將會使其變得更加困難。 –

+0

是的。這不是一個好的選擇。我會再等幾天,看看其他人是否對我的問題有其他意見,然後再將其標記爲答案。 –