FULLTEX搜索Mysql中不同表的两列

时间:2018-07-09 09:27:33

标签: mysql full-text-search

有人可以帮助我查找全文搜索查询吗? 我有两列Product和Generic。

表产品:

1. ProductID (Integer)
2. GenericID (Integer)-FK
3. Product_Name (Varchar)

在表通用中:

1. GenericID (Integer)
2. Generic_Name (Varchar)

我需要的是使用Product_Name和Generic_Name的组合名称搜索输入字符串。

我的示例查询如下

 SELECT 
 prod.ProductID AS ID,
 generic.Generic_Name AS genericName,
 prod.Product_Name AS packageName
 FROM
 Product prod
 INNER JOIN
 Generic generic ON prod.GenericID  = generic.GenericID 
 WHERE
 MATCH (prod.Product_Name ,generic.Generic_Name) AGAINST('+acb* +ace* +serr*  +para*' IN BOOLEAN MODE)
 ORDER BY prod.Product_Name  ASC

它不起作用,因为列在不同的表中。

1 个答案:

答案 0 :(得分:0)

FULLTEXT搜索操作均使用FULLTEXT索引。该索引只能在一个表上。

因此,您可以尝试使用两种全文本搜索操作...

WHERE (  
  match(prod.Product_Name) against('+acb* +ace* +serr*  +para*' in boolean mode)
  OR
  match(generic.Generic_Name) against('+acb* +ace* +serr*  +para*' in boolean mode)
)

或者,为了获得最佳性能和结果集排名,您可以像这样建立一个新的name

GenericId     NOT a primary key
IsGeneric     1 or 0
Name          either Product_Name or Generic_Name

您将从其他两个表中的名称的并集构造此表。例如,它可能包含

  4321  0   Advil
  4321  0   Motrin
  4321  1   Ibuprofen
  4322  0   Coumadin
  4322  1   Warfarin

然后,像这样的查询就可以解决问题

 select  prod.ProductID  AS ID,
         generic.Generic_Name AS genericName,
         prod.Product_Name  AS packageName
    FROM Product prod
   INNER JOIN Generic generic ON prod.GenericID  = generic.GenericID
   INNER JOIN Name ON Name.GenericID = prod.GenericID
   WHERE MATCH(Name.Name) AGAINST('+acb* +ace* +serr*  +para*' in boolean mode)
   ORDER BY prod.Product_Name  ASC

第二种选择是编写更多的工作。但是,因为它将商品名和通用名都放在一个全文索引中,所以它会更快并且可能会产生更好的结果。