如何返回在 SQL Server Full-Text 中索引的文档的全文?

iiv*_*vel 5 sql-server full-text-search filetable sql-server-2014

我使用带有 FileTables 的 SQL Server 2014 来存储大量不同格式的文档。iFilter 运行良好,所有内容都使用 FTS + 语义搜索编制索引。现在我想对这些文档的文本进行一些额外的处理,但没有理由让管道重做解码、提取等文件中的文本的工作。

似乎应该有一个明显的解决方案......但我一直在兜圈子,没有任何运气。

所以问题是:

  • 如何查询以在 T-SQL 中返回文件的完整纯文本?

  • 如果这是不可能的,可以在正常的 FTS 解析器运行后在 SSIS 或 SSAS 中完成吗?

  • 如果这是不可能的,有没有办法连接到 FTS 管道(可能通过触发器),以便我可以将纯文本拆分到另一个表中?

如果您有很好的示例供我参考,也欢迎使用其他解决方案。我唯一的直接想法是使用不同的网络共享进行下载,让 SSIS 拿起文件并提取文本(不知道怎么做),然后将文件 + 文本移动到 SQL 服务器......但是由于很多原因,这似乎很不稳定。

[编辑以澄清“为什么”]

如果 SQL Server 已经提取了文本以便对其进行分块并为语义索引执行基本 NLP ......我宁愿使用它而不是重新发明轮子。我正在研究的具体用途是使用其他 NLP 实用程序(例如 NLTK、GenSim、Stanford NLP NER 等)进行后处理,以便我可以生成提取文档摘要,为我的语料库存储 n-gram 统计信息,并将 NER 包括在内更有效的分面搜索。

如果我必须在将文件存储在 SQL Server 之前从文件中提取文本(使用 SSIS/.NET 以便我可以保留 iFilter 或完全使用不同的工具),则 SQL Server 在 FileTables 上执行该工作的能力有限除了最基本的任务之外的任何事情。

考虑已经支持的文档格式的数量 - 重新创建该功能是一项主要任务。同样,之后必须返回到实际文件并重做索引工作效率低下,在 FileTables 上禁用 FTS,完全跳过使用它们,或者完全废弃 SQL Server 以使用基于文档的 FTS,这似乎是明智的。

RLF*_*RLF 3

我很好奇你通过获取纯文本会完成什么。您已将文档存储在 FileTable 中,并且可以在需要时使用适当的工具打开这些文件。

例如:如果您正在查看 PDF、Word 文档、Excel 电子表格等,您可能拥有查看数据的工具。大多数工具甚至允许您手动保存“纯文本”。但我想这取决于你如何定义“纯文本”。将 Word 文档保存到非 Unicode .TXT 文件?或者更复杂的东西?

当然,我意识到您可能需要一种更加自动化的方法,我将在下面对此进行评论。

需要知道的一件事是,并非所有文件都必须复制为“纯文本”。(至少在处理中文纯文本时遇到了麻烦。)

关于全文索引:

尽管 SQL Server 全文索引知道索引中“单词”的相对位置,以便可以搜索短语,但它没有界面来显示文本中单词的连续顺序。因此,(目前)无法从全文索引构建纯文本。

即使这些详细信息可用,全文索引仍然不具备完整表示文档所需的一切。

  • 如果您进行了任何Stop Words配置,那么它们将不会出现在全文索引中。
  • 通常不包含标点符号,除非在单词中进行标记,例如“pre-apocalypse”、“FBI”等。
  • 格式丢失。
  • 用于全文索引的语言可能会影响结果。

全文索引正在解决与创建纯文本不同的问题。然而,我的经验是,无论如何,大型文本库通常都会受益于全文索引,因为有人总是试图找到一些东西

据我所知,一旦您获得文本,您将把它冗余地存储在 SQL Server 表中,以便加快您对纯文本数据的使用。

自动提取和加载

这需要一些工作。但是,由于您的文档当前位于 FileTable 中,您应该能够使用文件工具从文件系统访问它们。下面对纯文本提取的“离题”答案包括其他人正在使用的几种工具。也许其中一些工具对您有用。

http://stackoverflow.com/questions/5671988/how-to-extract-just-plain-text-from-doc-docx-files-unix
Run Code Online (Sandbox Code Playgroud)

由于您使用的是 SQL Server 2014,一旦您拥有纯文本文件,您应该能够通过多种方式导入它们:BCPSSIS和其他工具可用于加载数据。

根据您的方法,您可能会选择使用临时表在将数据移动到目标表之前进一步准备结果。如果您还进行文档版本控制,您可能需要创建一些元数据来跟踪不同的版本。