跨列的全文搜索

时间:2013-04-01 14:23:14

标签: sql sql-server full-text-search

对于糟糕的帖子标题感到抱歉,但我无法总结这一点。

最好使用一个例子。说我有这个简单的表有两个文本列(我将其他列留下)。

Id    Text_1  Text_2
1     a       a b
2     c       a b

现在如果我想搜索'“a”而不是“b”',在我目前的实现中我得到了记录1。我理解为什么会这样,这是因为搜索条件与“Text_1”列匹配,而对于记录2,它与任何列都不匹配。

然而,对于最终用户而言,这可能并不直观,因为它们可能意味着在大多数时间内排除记录1。

所以我的问题是,如果我想告诉SQL Server“匹配所有列”(意味着如果在任何列上找到“NOT”部分,则记录不匹配),是否可能?

编辑:这是我的查询在这个例子中的样子:

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits
ON TextHits.[KEY] = simple_table.Id
ORDER BY Rank DESC

实际查询有点复杂(更多列,更多连接等),但这是一般的想法:)

谢谢!

1 个答案:

答案 0 :(得分:1)

将针对每条记录对逻辑进行评估,因此如果您希望从一行中的一个记录中排除命中以排除该行,则应使用NOT EXISTS并将fullText查询分解为单独的包容性和排他性的部分......

SELECT  Id, 
        TextHits.RANK Rank, 
        Text_1, 
        Text_2 
FROM    simple_table
JOIN    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits
        ON  TextHits.[KEY] = simple_table.Id
WHERE   NOT EXISTS (SELECT  1
                    FROM    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits
                    WHERE   TextHits.[KEY] = exclHits.[KEY])
ORDER BY Rank DESC