SQL Server 2008 - 全文查询

时间:2010-05-03 12:50:29

标签: sql sql-server-2008

我公司的SQL Server 2008数据库中有两个表。第一个表格代表我公司销售的产品。第二个表包含产品制造商的详细信息。这些表定义如下:

  Product
  -------
  ID
  Name
  ManufacturerID
  Description

  Manufacturer
  ------------
  ID
  Name

您可以想象,我希望让客户尽可能轻松地查询此数据。但是,我在写一个宽容但强大的搜索查询时遇到了问题。例如,我期待人们根据语音拼写进行搜索。因此,数据可能与我的数据库中的确切数据不匹配。此外,我认为有些人会首先按制造商的名称进行搜索,但我希望首先显示匹配的产品名称。根据这些要求,我目前正在进行以下查询:

  select
    p.Name as 'ProductName',
    m.Name as 'Manufacturer',
    r.Rank as 'Rank'
  from
    Product p inner join Manufacturer m on p.ManufacturerID=m.ID
      inner join CONTAINSTABLE(Product, Name, @searchQuery) as r

奇怪的是,这个查询引发了一个错误。但是,我不知道为什么。 Squiggles出现在管理工作室最后一个括号的右侧。工具提示“在预期条件的上下文中指定的非布尔类型的表达式”。我理解这句话的意思。但是,我想我不知道COntainsTable是如何工作的。我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:2)

首先,我认为在加入全文CONTAINSTABLE时需要一个'ON'子句。请参阅Microsofts网站上的这个例子:

USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)'
        ) AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
    AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

http://msdn.microsoft.com/en-us/library/ms177652.aspx

您需要通过添加如下的连接子句将Product表链接到正确的搜索结果:

SELECT
    p.Name AS 'ProductName',
    m.Name AS 'Manufacturer',
    r.Rank AS 'Rank'
  FROM
    Product p 
      INNER JOIN Manufacturer m ON p.ManufacturerID=m.ID
      INNER JOIN CONTAINSTABLE(Product, Name, @searchQuery) AS r
        ON p.ID = r.[KEY]

否则,您不知道结果表中的哪些行连接到源表中的相应行。

其次,除非您使用通配符(例如CONTAINS),否则CONTAINSTABLE'"bol*"'都会返回完全匹配的字符串。即使使用通配符,您也只能使用后缀通配符,因此对于'"bol*"',它会找到所有以'bol'开头的单词。 '"*bol*"'将找不到包含'bol'的字词。对于不精确的模糊样式搜索,您应该使用FREETEXT( ... )FREETEXTTABLE( ... )

  

返回包含基于字符的数据类型的列的零行,一行或多行的表,其中与指定的freetext_string中的文本的含义相匹配,但不符合的确切含义 。

http://msdn.microsoft.com/en-us/library/ms177652.aspx

权衡是CONTAINSFREETEXT表现更好,而FREETEXT提供更自然的结果。

最后,如果你想在语音上匹配SQL Server有内置函数SOUNDEX,它试图根据拼音或参数生成一个字母数字键。

-- Using SOUNDEX
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');

    Copy
----- ----- 
S530  S530  

(1 row(s) affected)

http://msdn.microsoft.com/en-us/library/ms187384.aspx

我建议不要使用soundex,我发现它在过去是有限的,因为Soundex真的只能确保语音从语音开始。 Soundex总是返回起始字母,前三个辅音用数字表示。有更好的算法版本被设计为soundex的替代品,请参阅Double Metaphone(或可用作标量函数的T-SQL version of Double Metaphone)。

Soundex或DoubleMetaphone未内置于SQL Server全文中,因此您需要手动实施搜索。

SELECT * FROM MyTable where SOUNDEX( MyColumn ) = SOUNDEX( 'MySearchQuery' )