全文搜索结果不如预期

时间:2010-12-08 05:49:59

标签: sql-server full-text-search

我正在使用Microsoft SQL Server 2008.我不是它的专家,但是我创建了一个全文索引,并且一直在编写一些查询。

它正常工作并返回一些结果,但我知道应该匹配的行并不总是包含在内。

无论如何要验证或检查指数?我进去了几次并“重新填充了索引”,所以我很确定它是对的。但是当你似乎没有得到正确的结果时你会怎么做。

我的查询相当复杂但是如果有人认为这是问题:

DECLARE @StartRow int;
DECLARE @MaxRows int;

SET @StartRow = 1;
SET @MaxRows = 10;

WITH ArtTemp AS
(SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY ArtViews DESC) AS RowID,
Article.ArtID,Article.ArtTitle,Article.ArtSlug,Category.CatID,Category.CatTitle,
Article.ArtDescription,Article.ArtCreated,Article.ArtUpdated,Article.ArtUserID,
[User].UsrDisplayName AS UserName
FROM Article
INNER JOIN Subcategory ON Article.ArtSubcategoryID = Subcategory.SubID
INNER JOIN Category ON Subcategory.SubCatID = Category.CatID
INNER JOIN [User] ON Article.ArtUserID = [User].UsrID
WHERE CONTAINS(Article.*,'FORMSOF(INFLECTIONAL,"HTML")'))

SELECT ArtID,ArtTitle,ArtSlug,CatID,CatTitle,ArtDescription,ArtCreated,
ArtUpdated,ArtUserID,UserName
FROM ArtTemp
WHERE RowID BETWEEN @StartRow + 1 AND (@StartRow + @MaxRows)
ORDER BY RowID

在上面的查询中,返回行。但是,我知道至少有一行包含“HTML”一词。

任何疑难解答提示?

2 个答案:

答案 0 :(得分:1)

我不知道这是不是问题,但是当我第一次开始使用MySQL和全文索引时,我常常遇到“停用词”的问题(http://dev.mysql.com/doc/refman/5.1 /en/fulltext-stopwords.html)和最小字长(http://www.devcha.com/2008/03/display-mysql-fulltext-search-settings.html)。有时,全文搜索会忽略某些术语,因为它们位于禁用词列表中,或者它们比最小词长度短。

还有另一个问题,如果我表中超过50%的行符合搜索条件,标准全文搜索将不会返回ANYTHING。切换到布尔搜索模式解决了> 50%的问题,但没有解决阻塞/最小长度问题。

我必须创建一个回退%LIKE%搜索全文的东西。可能不是最好的方法,但是当全文搜索没有时,它至少会返回有效的结果。

Microsoft SQL Server可能有所不同,但我希望这有点帮助!

答案 1 :(得分:1)

我不是SQL专家,但是'SELECT TOP(@StartRow + @MaxRows)'转换为选择符合条件的前11行(start = 1 max = 10),无论其RowID如何,不从行1-10中选择。稍后您选择结果'WHERE RowID BETWEEN @StartRow + 1 AND(@StartRow + @MaxRows)',这意味着只显示RowID在2-11之间的行。这可能就是为什么你没有收到你期望的所有结果。如果不是这种情况,那么我会确保您期望的行符合所有连接条件。