【问题标题】:Ignore newline characters when performing a fulltext search in MS SQL Server在 MS SQL Server 中执行全文搜索时忽略换行符
【发布时间】:2016-05-09 16:25:47
【问题描述】:

我有一个表,其中一个列上有全文索引。此列中的文本可以包含换行符“\r\n”,例如

line1\r\nline2

目前我正在使用以下SQL进行搜索

SELECT * FROM SomeTable WHERE CONTAINS(TextValue, '"*line1*"')

匹配成功。但是,我的用户希望能够进入

"line1 line2"

作为搜索词也应该成功匹配。换句话说,我希望搜索忽略“\r”和“\n”。

我试过了

SELECT * FROM civ.MetadataFieldValues WHERE CONTAINS(REPLACE(REPLACE(TextValue, CHAR(13), ' '), CHAR(10), ''), '"*line1 line2*"')

但这会返回错误

Incorrect syntax near '('.

有没有办法使用 CONTAINS 来实现这一点?

【问题讨论】:

  • 不应该默认全文搜索忽略换行符、空格和填充词,如“and, the, a, etc”?
  • 不能那样工作。我解析单词。
  • “line1 line2”是否作为输入参数提供给查询(假定为 proc)?
  • @EastOfJupiter 是的,“line1 line2”直接来自前端用户输入的,所以是入参。虽然它不是一个过程;我正在手动生成 SQL 作为 NHibernate ICriteria 的一部分。
  • @Kritner 它确实忽略了输入中的空格。如果我在输入字符串中的 line1 和 line2 之间添加空格,那么它仍然有效。不过,对于 \n 或 \r 似乎并没有做同样的事情。

标签: tsql full-text-search newline


【解决方案1】:

CONTAINS 使用全文索引。因此,如果您在搜索之前使用函数修改字段的内容,那么全文索引的优势将失效。

可以在视图上创建全文索引。因此,我建议使用第二个字段创建一个视图,该字段包含与当前搜索字段完全相同的内容,但您可以用空格或其他无害的字符替换任何不需要的特殊字符。然后,您可以在视图中的新字段上创建全文索引,并在视图中的该字段上使用 CONTAINS。

【讨论】:

  • 谢谢。如果您在搜索之前修改值,那么您所说的索引无效的优势是有意义的。这可能就是我上面的 SQL 语句不起作用的原因。我会考虑您建议的视图选项,甚至可能会找到另一种方法来完全避免该问题。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多