2017-02-25 50 views
0

我们有一个全文索引的nvarchar(max)列。在此栏中存储的文本中有全部短语/句子/段落,在进行全文搜索时应该忽略它们。例如,让我们看看那些包含“快速棕色狐狸跳过懒惰狗”的行,并且你不希望这个短语被索引,因为在这种情况下,“狐狸”应该被忽略,但如果“狐狸”出现在其他部分文本是相关的,不应该被忽略。控制nvarchar列中的文本SQL Server的全文引擎索引

是否有任何方法来过滤全文索引引擎从列中读取的文本,以便它不索引这些短语?

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

回答

1

SQL Server支持Stopwords and Stoplists,请检查出来。但是这些都与个人的话有关。不确定你将能够使用停用词/ stoplists过滤整个短语。

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

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

或者,在插入过程/更新你原来的列数据复制到fts2_col的是,还设立了夜间或每小时的进程/作业,以定期检查您的FTS索引表中的所有新/更新的记录,并提取所有噪音来自fts_col2的单词/短语。当检测到fts_col2值已更改时,SQL Server将自动重建全文索引。

HTH

+0

谢谢,我们考虑过停用词和第二栏。我也假设停用词只能是单个词,尽管我没有测试过这个假设。第二栏的问题是数据的重复。我会添加一个答案,概述我们正在考虑的做什么 –

+1

@PhilHaselden是的,第二个FTS索引列意味着数据重复,但它也提供了易用性,因为您将从FTS搜索立即获得正确的记录,需要额外的JOIN。您的消音语法也可能起作用,但如果您的原始表格包含一百万条记录,即使每封电子邮件只有两个噪音短语,您也将在DocumentNoisephrase表中记录两百万条记录,必须根据每个查看请求搜索并加入该记录。您还必须正确处理插入/更新/删除到主表中并更新噪音表。 – andrews

+0

@PhilHaselden继续以前的评论......所以从我的SQL Server FTS体验来看,性能方面的最佳方法是为FTS引擎提供最终版本的数据,即使它带有数据复制成本。而且,像lucene/solr和elasticsearch这样的外部搜索引擎也完全一样:它们从多个连接的表中获取数据,然后构建一个大的平面“表/视图”,然后它们就是FTS-index。通过这种方式,他们可以立即为搜索结果提供各种聚合sum()/ count()计数。 – andrews

0

一个选项是噪声短语提取到一个单独的表,与关于提取的短语的原始字符位置信息。当显示整个文本时,我们将通过将提取的噪音词组插入原始位置重新构建文档。

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