具有多个条件的全文搜索

时间:2014-03-19 08:00:05

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

我有两张桌子:

FirstTable
===============================
Id int primary key identity ,
Text varchar(4000)


Phrase
===============================
Id int primary key identity ,
Text varchar(4000) ,
ExcludingText varchar(4000)

我需要从第一个表中过滤包含词组表的Text列值的行,而不要包含同一行的ExcludedText值。

表之间不存在任何关系,对于FirstTable的每一行,我必须检查每个现有组合(包括Text,不包括ExcludedText)。

1 个答案:

答案 0 :(得分:0)

您可以根据Phrase表的内容动态构建全文查询。

declare @FullTextCondition as varchar(max)
set @FullTextCondition = STUFF(
    (
        SELECT '"' + Text + '" AND NOT "' + ExcludingText + '" AND '
        FROM Phrase 
        FOR XML PATH(''), TYPE
    ).value('.', 'varchar(max)'),
    1, 0, ''
)

-- remove trailing ' AND '
set @FullTextCondition = SUBSTRING(@FullTextCondition, 0, LEN(@FullTextCondition) - 3)

-- now perform your full text search
SELECT *
FROM FirstTable
WHERE CONTAINS(*, @FullTextCondition)

例如,如果您的Phrase表包含此数据:

Id  Text       ExcludingText
-------------------------------------
1   good       bad
2   ok         not ok

然后您的全文查询(@FullTextCondition)将如下所示:

'"good" AND NOT "bad" AND "ok" AND NOT "not ok"'

当然,请考虑Phrase表的大小。如果它非常大,那么它将影响性能