我想对以下查询执行SQL Server全文搜索:
select distinct
Products.ProductID, Products.ProductCode, Products.PTitleF,
STUFF((SELECT distinct
', ' + Author.AuFirstName + N' ' + Author.AuLastName + N' '+
ISNULL(Translator.FirstName,N' ')+N' '+ISNULL(Translator.LastName,N'
')+N' '+p.PTitleF+N' '+ISNULL(Publishers.PName,N' ')
FROM
Publishers
INNER JOIN ProductPublisher ON
Publishers.PublisherID = ProductPublisher.PublisherID
RIGHT OUTER JOIN
ProductTranslator
INNER JOIN Translator ON
ProductTranslator.TranslatorID = Translator.TranslatorID
RIGHT OUTER JOIN
Products AS p ON
ProductTranslator.ProductID = p.ProductID ON
ProductPublisher.ProductID = p.ProductID
LEFT OUTER JOIN
ProductAuthor
INNER JOIN
Author ON
ProductAuthor.AuthorID = Author.AuthorID ON
p.ProductID = ProductAuthor.ProductID
WHERE
Products.ProductID = p.ProductID
FOR XML PATH ('')), 1, 1, '') Authors
from
Products;
如您所见,我想将多个表中的某些字段合并为一个记录,以对它们执行全文搜索。
在这里实现目标的最佳方法是什么?
谢谢。
答案 0 :(得分:1)
在进行搜索之前,请运行上面查询的SELECT部分,确保原始输出中提供了您要查找的所有数据。有了这么多的内部和外部连接,您可能正在消除您正在寻找的行。在你走得更远之前,这是一个很好的初步检查。
其次,我赞成查看这些列而不是STUFF。当然这取决于您的数据和需求,但我会首先尝试查看所有这些已加入的列。
接下来确保安装并配置了全文搜索:
确保在SQL Server上安装了全文搜索。它默认不安装,在SQL Express上不可用。 (您没有指定您的版本)
创建全文搜索目录以存储全文索引数据。
创建FULLTEXT CATALOG foo;
如果这是唯一的全文目录,您可以将其指定为默认目录:
CREATE FULLTEXT CATALOG foo AS DEFAULT;
为您要查找的表/列添加一些全文索引到全文搜索目录。您可以一次将这些索引设置为一个表。
在dbo.Author上创建FULLTEXT索引( AuFirstName LANGUAGE 1033, AuLastName LANGUAGE 1033 )KEY INDEX [PK_dbo.Author] ON foo;
1033 表示全文搜索应使用英语词典,如果不正确,则需要查找所需语言的数字。
全文索引表需要知道表的主键。我猜这个表的主键(PK)叫做 [PK_dbo.Author] 。 请确保将[PK_dbo.Author]替换为作者表的正确PK。
您尚未准备好使用CONTAINS或FREETEXT关键字使用全文SQL查询搜索数据。