【问题标题】:Controlling what text SQL Server's Full-text Engine indexes in a nvarchar column控制 nvarchar 列中 SQL Server 全文引擎索引的文本
【发布时间】:2017-02-27 09:48:46
【问题描述】:

我们有一个全文索引的 nvarchar(max) 列。在此列中存储的文本中,有完整的短语/句子/段落,在进行全文搜索时应忽略它们。例如,让我们有一些行包含“the quick brown fox jumped over the lazy dog”,并且您不希望该短语被索引,因为该上下文中的“fox”应该被忽略,但如果“fox”出现在其他部分文本是相关的,不应忽略。

有没有办法过滤全文索引引擎从列中读取的文本,使其不索引这些短语?

一个更具体的例子:电子邮件的正文存储在数据库中。有没有办法将所有签名/病毒检查器信息保留在电子邮件文本中,但在进行全文搜索时完全忽略它?

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    SQL Server 支持Stopwords and Stoplists,请查看。但这些都与单个单词有关。不确定您是否能够使用停用词/停用词列表过滤整个短语。

    我认为您唯一的选择是准备/清理您的数据。为此,请从全文索引中删除您原来的 nvarchar(max) 列,而是在您的表中添加一个新列(例如 fts_col2),该列将保存为全文搜索准备/过滤的数据。然后将此新列添加到全文索引中。

    当您的原始列被插入或更新时,您应该使用插入/更新触发器在fts_col2 中插入/更新数据。在这些触发器中,针对正在插入/更新的原始 nvarchar(max) 列的值运行所有自定义过滤。

    或者,在插入/更新期间,您可以将原始列数据按原样复制到 fts2_col,但也设置每晚或每小时的进程/作业,以定期检查 FTS 索引表中的所有新/更新记录并提取所有噪音 来自fts_col2 的单词/短语。 SQL Server 在检测到fts_col2 值发生变化时会自动重建全文索引。

    HTH

    【讨论】:

    • 谢谢,我们考虑了停用词和第二列。我还假设停用词只能是单个词,尽管我没有测试过这个假设。第二列的问题是数据重复。我将添加一个答案,概述我们正在考虑做的事情
    • @PhilHaselden 是的,第二个 FTS 索引列意味着数据重复,但它也提供了易用性,因为您将立即从 FTS 搜索中获得正确的记录,无需额外的 JOIN。您的 Noisephrases 方法也可能有效,但如果您的原始表包含 100 万条记录,即使每封电子邮件只有 2 个噪音短语,您将在 DocumentNoisephrase 表中包含 200 万条记录,必须在每次查看请求时搜索和加入。您还必须正确处理对主表的插入/更新/删除,并更新噪声表。
    • @PhilHaselden 继续之前的评论...所以根据我的 SQL Server FTS 经验,就性能而言,最好的方法是为 FTS 引擎提供最终版本的数据,即使它带有数据重复成本。此外,像 lucene/solr 和 elasticsearch 这样的外部搜索引擎的做法完全相同:它们从多个连接表中获取您的数据,然后构建 1 个大平面“表/视图”,然后对其进行 FTS 索引。通过这种方式,他们能够立即提供具有各种聚合 sum()/count() 计数的搜索结果。
    【解决方案2】:

    一种选择是将噪声短语提取到单独的表中,以及提取短语的原始字符位置信息。当需要显示整个文本时,我们将通过将提取的噪声短语插入回原始位置来重建文档。

    由于噪音短语很常见,最终解决方案可能会包括 2 个额外的表格。包含 ID 和短语的 Noisephrase 表,以及包含以下列的 DocumentNoisephrase 表:DocumentID、NoisephraseID、CharPosition 和 ExtractionOrder。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-22
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多