2013-04-30 74 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