首页 > 解决方案 > FULLTEX在Mysql中不同表的两列上搜索

问题描述

谁能帮我找到全文搜索的查询?我有两列产品和通用。

表-产品:

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

它不起作用,因为这些列位于不同的表中。

标签: mysqlfull-text-search

解决方案


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

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


推荐阅读