2013-04-30 38 views
2

我爲一家店鋪建立了一個網站,該店鋪使用sql表來管理他們產品的數據。MySQL全文搜索奇數行爲

我使用全文搜索,因此用戶可以通過股票輕鬆搜索。

搜索運行查詢術語與產品的品牌,名稱和描述相符,就像這樣:

$search_prods = $db_connection->query(" 

    SELECT  `id`,`name`,`description` 
    FROM  `Products` 
    WHERE  Match(`brand`) Against('$term') 

    UNION 

    SELECT  `id`,`name`,`description` 
    FROM  `Products` 
    WHERE  Match(`description`) Against('$term') 

    UNION 

    SELECT  `id`,`name`,`description` 
    FROM  `Products` 
    WHERE  Match(`name`) Against('$term') 

    "); 

搜索的工作原理與品牌「潘多拉」打交道時,除了罰款。如果我搜索不同的品牌,我會得到我的結果。如果我搜索潘多拉盒子,我會在潘多拉盒子的名稱和結果中找到與潘多拉盒子相關的結果。不過,我無法在品牌中獲得潘多拉的任何結果。他們確實存在!我試過在MySql中運行查詢,並得到同樣的問題。

什麼是在'品牌'欄中搜索'潘多拉'是導致問題?任何人有任何想法?

謝謝!

回答

1

默認情況下,MySQL的全文搜索ignore common words

詞存在於行的50%以上被認爲是常見的不匹配。

如果超過50%的產品是品牌「潘多拉」,那麼這就是解釋。

您可能想要嘗試在查詢中添加IN BOOLEAN MODE修飾符以禁用此功能。

順便說一句,你可以(讀真的應該)重寫查詢如下:

SELECT id, name, description 
FROM Products 
WHERE MATCH(brand, description, name) AGAINST('$term' IN BOOLEAN MODE) 
+0

感謝您的回答,並感謝您的建議。我最初編寫了我的查詢,但失敗了。由於我讀的範例只與一列匹配,因此我認爲這是該函數的一個限制。我猜我第一次犯了一個錯字或什麼... – user1537360 2013-04-30 16:30:49

+0

@ user1537360「*我寫了我最喜歡的查詢*」=>你是指我的答案的第一部分(添加'BOOLEAN MODE')或到第二部分(簡化查詢)?我的根本問題是:它解決了問題嗎? ;) – RandomSeed 2013-04-30 16:34:26

+0

我的意思是我原來的結構化查詢就像在你的三個整合建議中一樣。在閱讀您的評論後,我再次嘗試並得到相同的問題,但後來我注意到您的查詢包含布爾模式。當我包含布爾模式時,它解決了這個問題。 至於我在OP中提到的問題,你已經發現了。問題是我的演示產品中有5/8個是該品牌的。我添加了一些其他品牌的產品,問題解決了。 我還沒有研究過這個功能,因爲我一直在這麼急,所以謝謝你的幫助! – user1537360 2013-04-30 19:13:36