2010-08-09 38 views
0

我有一個表在我的MySQL數據庫中有Title(varchar(255))和Edition varchar(20))的書。這些例子的值是「微觀經濟學入門」和「4」。FULLTEXT在一個非常小的列上搜索

我想讓用戶根據標題和版本搜索圖書。因此,例如,他們可以輸入「微觀經濟學4」並獲得正確的結果。我的問題是我應該如何在數據庫端進行設置。

我被告知FULLTEXT搜索通常是做這種事情的好方法。但是,由於版本有時只是單個字符(「4」),因此必須設置全文搜索以查看單個字符(ft_min_word_len = 1)。這聽起來非常低效。

那麼,我該如何設置這個數據庫的搜索?我知道這裏可以使用CONCAT/LIKE ..我的問題是這是否是最好的方式,或者與替代方案相比,它是否會太慢。我的書籍數據庫有數十萬本書籍,很多用戶將搜索它。

回答

0

您可以在title列中設置全文索引,並且只將edition列上的數字與標準運算符( >,<,=)。儘管您必須從業務層的搜索查詢中提取信息。

+0

與此問題是,我想不出一個歧視版本的規則。示例版值: - 「4」 - 「4th」 - 「25週年紀念版」 - 「特別收藏版」 – babonk 2010-08-09 23:09:47

1

如果您正在尋找準確的版本搜索,繞過ft_min_word_len我建議您在用戶搜索表單中有兩個字段,一個用於標題,一個用於版本,以便您不必猜測是否/在哪裏是搜索短語中提及的版本(版本也可以是可選的)。在這種情況下,版本列中的版本搜索將使用「LIKE」。

另一個解決方案 - 因爲你的字符大小非常小 - 是創建一個專用於FullText索引/搜索的新列,在這裏你連接標題和版本。爲了不擔心ft_min_word_len和Edition,首先將您自己保留的不太可能被用戶搜索的單詞(如「EDNB」)和版本(當它是一個數字(或小)時)進行連接。

在這種情況下,當您創建新列,解析版(這可能對標題做以及):

  • 改變這一切只位數的話n,可以「EDNB」 + N(例如, 「4」=> 「EDNB4」)
  • 然後NewColumn =標題+ 「」 +新版本合唱團

當用戶搜索的東西,

  • IDE在搜索短語中取代所有她的號碼並用「EDNB」+ n代替。

您可能希望將ft_min_word_len更改爲3以捕捉「1st」或「3rd」(或者您也可以EDNB他們)。

請注意,擁有一個新的獨立搜索列可能很方便:不區分大小寫(因爲Fulltext已經這樣做),而是搜索拼寫錯誤的重音單詞。你會把所有口音都改爲無重音字母。

例如,如果標題是「Recette de lacrèmebrûlée」並且版本是「France 4」,那麼您最終會搜索「recette de la creme brulee france EDNB4」。如果用戶搜索「crëme4」,「ë」變成「e」,「4」變成「EDNB4」,並且她的搜索短語變成「奶油EDNB4」。