在多列和谓词上使用CONTAINS进行全文搜索 - AND

时间:2013-12-09 16:32:50

标签: tsql full-text-search full-text-indexing

我有一个搜索表,例如,要搜索的4列文本数据。

我这样做:

SELECT * FROM dbo.SearchTable
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2')

如果term1和term2在同一列中, Contains 只返回 true 。有没有办法指定所有列都应包含在AND?

如果没有,我的想法是JSON所有搜索列并将它们合并为一个。这样我就可以全文搜索它们,但仍然可以轻松地在.NET中提取各个列。我假设索引器不会遇到问题,并且会省略JSON字符和引号。这是对的吗?

由于

修改

考虑到JSON的想法,抓取工具还会为属性名称编制索引,因此我必须将{name},{details},{long_details}重命名为{x1},{x2},{x3确保他们不会在搜索中被挑选。希望如果他们如此短暂,他们无论如何都不会被编入索引。

EDIT2

我可以根据系统停止列表创建一个Stoplist,并将属性名称放入其中。

1 个答案:

答案 0 :(得分:16)

这应该有效:

SELECT * FROM dbo.SearchTable
WHERE CONTAINS((co1, col2, col3, col4), 'term1')
AND CONTAINS((co1, col2, col3, col4), 'term2');

或者,您可以添加一个带有全文索引的新计算列。添加如下列:

computedCol AS col1 + ' ' + col2 + ' ' + col3 + ' ' + col4

并创建全文索引:

CREATE FULLTEXT INDEX ON SearchTable (computedCol LANGUAGE 1033)
KEY INDEX pk_SearchTable_yourPrimaryKeyName

然后你可以这样做:

SELECT * FROM dbo.SearchTable
WHERE CONTAINS(*, 'term1 AND term2')