如何对文本和 html 使用 sql 服务器的 containstable 函数

How to use containstable function of sql server for both text and html

我在一个应用程序中工作,在该应用程序中,客户端从前端发送简历的关键字,并通过使用 containstable 我们在 table 的列中搜索该关键字并将结果返回到前端。

在我的申请中,我们最初以文本格式保存简历详细信息,然后我们开始添加 html 表格。现在搜索功能对于旧的简历文本工作正常但在 Html 的情况下没有得到预期的结果所以我们可以做些什么来包含 table 搜索功能将适用于他们两个,即文本或 html

查看文档msdn,您可以看到对于 varbinary(max) 或图像,您可以指定包含 varbinary(max) 列文件类型的辅助列。

column_name [ TYPE COLUMN type_column_name ]

At indexing time, the Full-Text Engine uses the abbreviation in the type column of each table row to identify which full-text search filter to use for the document in column_name. The filter loads the document as a binary stream, removes the formatting information, and sends the text from the document to the word-breaker component. For more information, see Configure and Manage Filters for Search.

哎哟喂。您已经进入了全文索引的阴暗世界……从这里开始是一段艰难的攀登,所以请把它打包在我的朋友中。 =)

你遗漏了一些更详细的细节,所以在我们继续之前,我假设两件事:

  1. 包含简历文本的列是 varchar(max) 或 nvarchar(max)

  2. 您已在包含所述列的 table 上创建了全文索引

现在,进入细节。首先让我说我绝不是 SQL 服务器全文索引专家(真的有人吗?)...我所学到的是痛苦的试错,所以把它当作什么这是。话虽如此,您的情况听起来与我今年早些时候遇到的情况非常相似,因为我们继承了一个系统,其中包含一个 text 类型的全文索引列(我们迁移到了 varchar (max)) 并且此列包含 'plain' 文本和 html 换行文本。我们面临的挑战是,当最终用户通过前端应用程序针对这个全文索引执行搜索时,查询会同时匹配纯文本和 html。因此,例如,如果用户搜索 'Roman',他们可能会从纯文本内容以及引用 'Times New Roman' 的 html 标签中 return 命中... 不是 期望的行为。

坏消息是我确实没有找到一个直接的解决方案。我所知道的唯一可能的 SQL 服务器端解决方案涉及将列的数据类型转换为 varbinary(max),创建一个 'companion' 列,将 varbinary(max) 列指定为类型 'HTML',然后利用 Microsoft iFILTER 获得 HTML...更多 here, and here, and some good general BOL resources here and here

最后,我们确定这不适合我们,因为:

  1. 即使 iFILTER/Full-text 索引功能 100% 成功实施,我们也不相信它会按需执行
  2. 将列转换为 varbinary(max) 本身会对性能产生影响,因为我们必须动态地将所有读取和写入转换为 varbinary 数据类型...为我们不喜欢的应用程序代码和优化器。

我们最终实现了有助于清理结果并充分满足该特定项目需求的应用程序端逻辑。

我不想完全阻止你尝试实现你正在尝试的目标,但我确实希望你至少睁大眼睛进入它,意识到挑战......希望这会拯救你一些挫折和浪费时间!

请帮社区一个忙,post 支持任何成功或吸取的教训 - 目前关于这方面的信息很少,这将对其他人有很大帮助。

祝你好运!