有人可以帮助我查找全文搜索查询吗? 我有两列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
它不起作用,因为列在不同的表中。
答案 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
第二种选择是编写更多的工作。但是,因为它将商品名和通用名都放在一个全文索引中,所以它会更快并且可能会产生更好的结果。