2014-01-13 70 views
0

我正在使用PHP和MySQL。現在我正在用一系列LIKE和UNION搜索我的數據庫,因此根據用戶類型可能會出現的查詢來查詢我的數據庫 WEHRE title LIKE '%Term1%' AND title LIKE '%Term2%' UNION ... WHERE author LIKE ...如何創建MySQL搜索查詢以包含縮寫

您明白了。我在每個術語周圍添加通配符,並且術語由空間決定。然後,當結果返回時,我會突出顯示他們搜索的術語。很簡單,不要在這裏與Google競爭。 :)

現在我已經添加了一個字段,其中保存聖經參考用戶可以使用縮寫,如「山」或「山」。或「馬特」或「馬特」。或馬修。現在我可以很容易地通過從任何查詢中刪除時間從5秒減少到3秒,但包含其他問題的最佳方法是什麼?

此外,無論他們是搜索Mt或Matt還是Matthew,我仍然想要突出整個單詞Matthew,所以我要處理如何將它鏈接在一起。

我想出的唯一解決方案是製作一個3D數組並循環播放,如果我有一個Matt或Mt,那麼將它改爲Matthew,每本書的時間爲66。這是做這件事的好辦法,還是有更好的辦法?

謝謝。

+0

我想你應該構建一個可能的別名表,儘管公平起見,聖經可能已經被相當廣泛地索引了。 – Strawberry

回答

1

一個非常簡單的方法是,構建一個表來保存別名組:

CREATE TABLE AliasGroup (Alias NVARCHAR(50), GroupId INT) 
INSERT INTO AliasGroup 
VALUES ('Mt', 1) 
     ,('Matt', 1) 
     ,('Matthew', 1) 
     ,('Lk', 2) 
     ,('Luke', 2) 
     /* --- etc --- */ 

然後,對於存在於AliasGroup,表中的每個搜索詞,也突出了所有其他別名具有相同GroupId的。

現在,搜索這兩個「山」,「馬特」和「馬太福音」,當其中只有一個是實際的搜索項,快速和骯髒的查詢會是這個樣子:

SELECT ... 
FROM ... 
CROSS JOIN 
    (SELECT Alias FROM AliasGroup 
    WHERE GroupId = (SELECT GroupId FROM AliasGroup WHERE Alias = $term1)) A 
WHERE title LIKE '%' + Alias + '%' 

然而,這不是一個理想的方法,因爲WHERE子句中的LIKE運算符可能不會很好。如果您事先構建了獨特術語的索引表,那將會好得多。這很容易創建,例如使用PHP - 只需遍歷表中的所有記錄並按單個詞分割所有標題等。刪除標點符號,並將單個單詞與原始記錄的ID一起存儲在索引表中。每當遇到具有一個或多個別名的術語時,還要在索引表中寫入每個別名。然後對索引表進行所有搜索:

SELECT Id 
FROM IndexTable 
WHERE Term = $term1 
+0

那麼查詢會是什麼樣子?我以前從未使用過類似的東西。 – David

+0

@David我已更新我的帖子來回答這個問題。 – Dan

+0

我喜歡有索引表的建議,但我想弄清楚如何形成佈局,考慮一個標題可以是從2個字到30個任何地方。所以,我只是有一個表40列寬,這將適合我想要搜索的所有數據,並且每行都有一個索引?然後,我該如何去確保部分單詞仍然會被拾取?我不是又回到了LIKE嗎?對不起,天真,雖然我不是新手,但我是自學的,所以像這樣更復雜的事情是不是很容易知道。感謝耐心。 – David