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

17 t-sql full-text-search full-text-indexing

我有一个搜索表,比如说要搜索的4列文本数据.

我做这样的事情:

SELECT * FROM dbo.SearchTable
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2')
Run Code Online (Sandbox Code Playgroud)

如果term1和term2在同一列中,则看起来Contains仅返回true.有没有办法指定所有列都应包含在AND中?

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

谢谢

编辑

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

EDIT2

我可以根据系统Stoplist 创建一个Stoplist,并将属性名称放入其中.

may*_*lle 19

这应该工作:

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

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

computedCol AS col1 + ' ' + col2 + ' ' + col3 + ' ' + col4
Run Code Online (Sandbox Code Playgroud)

并创建全文索引:

CREATE FULLTEXT INDEX ON SearchTable (computedCol LANGUAGE 1033)
KEY INDEX pk_SearchTable_yourPrimaryKeyName
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

SELECT * FROM dbo.SearchTable
WHERE CONTAINS(*, 'term1 AND term2')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,其中一个值为null的SQL中的字符串连接将使用null替换整个表达式.您可以通过将每个可空术语包装为isnull来解决此问题,例如"isnull(col,'')". (5认同)
  • 这两个建议都是一个黑客。真的没有办法让 SQL Server 全文搜索按照 OP 想要的方式运行吗?有关该主题的 MS 文档似乎说明(结果含糊不清)搜索应跨越多列。它没有说搜索词必须完全在一列中找到。 (4认同)