【问题标题】:Full-text searching a SQL Server 2008 FileStream全文搜索 SQL Server 2008 FileStream
【发布时间】:2011-06-10 18:26:25
【问题描述】:

我有一个 SQL Server 2008 数据库,其中一个表启用了 FileStream。对于这个问题的其余部分,我将此表称为 Tbl_FileStream。

Tbl_FileStream 包含数十万个文件,从 PDF 到 JPG 再到 TXT 文件。

另外,Tbl_FileStream 具有在 FileStream 上创建的全文索引。全文索引工作得非常好,我有一个存储过程可以对它进行全文搜索(使用 CONTAINSTABLE 和 RANK),而且效果也很好。

但是,当在 FileStream 上搜索时,全文搜索能够返回给我时,我发现自己陷入了困境。例如,我们要搜索短语“et dolore”,然后我的搜索将产生表明 59 个文档与搜索词匹配的结果。当然,我可以获取找到匹配的文档的标题,因为我将文档标题存储在 Tbl_FileStream 中,但我真正需要的是在实际文件中获取搜索词周围的文本.

例如,假设我有一个包含以下拉丁文的文本文档——
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua。在 vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet。

使用 SQL Server 的全文搜索功能,如果我要搜索单词“et dolore”,那么我真正需要返回给我的是一些任意数量的单词(大约 10 个),然后是在其中找到搜索词的位置文件,所以我实际上会得到类似“... sed diam nonumy eirmod tempor invidunt ut labore et dolore ...”这样的短语。

对于那些想知道为什么世界上会有人想要这样做的人来说,原因是因为消费者希望快速浏览在每次点击中找到搜索词的上下文。换句话说,他们希望快速浏览搜索结果并尝试查看哪些文档命中可能包含他们正在寻找的内容。

这可以在 SQL Server 2008 中实现吗?

如果没有,那么是否有支持此功能的后端?

提前感谢我在这个困难的主题上收到的所有建议和帮助。

【问题讨论】:

    标签: sql-server-2008 full-text-search filestream lucene


    【解决方案1】:

    不幸的是,当前版本的 Sql Server 无法轻松完成您要查找的内容。

    【讨论】:

      【解决方案2】:

      仅使用 SQL Server 2008

      如果您坚持使用 SQL Server 2008,则必须将每个文件的文本内容存储在要搜索的数据库中。这意味着对于图像文件类型,您必须在文件上使用 OCR 程序并在数据库中保留文本的副本,以便可以对其进行搜索。这也意味着如果目标文件的内容由于某种原因超过 2 GB,您将不得不跳过这些环节。

      因此,假设您的文件元数据表中有以下列:

      TextContents nvarchar(max) null.

      然后我们可能会使用类似于以下内容的方法来提取上下文:

      Declare @SearchTerm nvarchar(max)
      Declare @MaxResultTextLen int
      
      Set @SearchTerm = 'et dolore'
      Set @MaxResultTextLen = 100
      
      Select  CharIndex(@SearchTerm, F.TextContents),
          Case 
          When CharIndex(@SearchTerm, F.TextContents) <= @MaxResultTextLen 
              Then Substring(F.TextContents, 1, @MaxResultTextLen) + '...'
          Else Substring(@SearchTerm
              , CharIndex(@SearchTerm, R.TextContents) 
                      - @MaxResultTextLen + Len(@SearchTerm)
              , @MaxResultTextLen) + '...'
          End As TextContext
      From Files As F
      Where Contains(F.TextContents, @SearchTerm)
      

      使用第三方搜索引擎

      更接近您想要实现的解决方案是使用第三方搜索引擎,该引擎将返回包含找到的搜索词的上下文。但是,同样,图像文件和图像类型的 PDF 必须进行 OCR 处理,以便引擎可以搜索文本内容。在一个名为 dtSearch 的引擎上进行快速搜索(我没有使用过也没有为它们工作过),我发现它提供了显示“突出显示的命中”的能力,意思是向用户显示文件中定位术语的上下文。

      dtSearch

      【讨论】:

      • 感谢您的意见。你基本上只是证实了我过去几周一直担心的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多