SQL Server 2008中已加入的分层记录的全文搜索

时间:2009-07-14 21:01:13

标签: sql-server full-text-search

可能是一个菜鸟问题,但我会继续这样做。

为了举例,我有一个Person表,一个Tag表和一个ContactMethod表。一个人将拥有多个Tag记录和多个与之关联的ContactMethod记录。

我想进行宽容的搜索,搜索每个表格中的几个字段。所以我可以通过他们的电子邮件(通过ContactMethod)找到一个人,他们的名字(通过Person)或分配给他们的标签。

作为FTS的完整菜鸟,我想到了两种方法:

  1. 构建一些复杂的查询,分别解决每个字段
  2. 构建某种查找表,该表连接我想索引的字段,并在该派生表上进行全文查询。
  3. (为清晰起见,请随意编辑;我不是为了重复点而进行编辑。)

3 个答案:

答案 0 :(得分:0)

一种可能性是创建具有以下列的视图:PersonID,ContentType,Content。 ContentType将类似于“电子邮件”,“电话号码”等......而内容将保持这一点。您将在“内容”列中搜索,并且您将能够看到此人的ID。我不是100%肯定全文搜索的工作原理,所以我不确定你是否可以在视图上使用它。

答案 1 :(得分:0)

FTS可以search multiple fields开箱即用。 CONTAINS谓词接受要搜索的列的列表。还CONTAINSTABLE

答案 2 :(得分:0)

如果您的sql server支持它,您可以创建索引视图和全文搜索;你可以使用containsstable(*,'“chris”')来读取所有列。

如果它不支持它,因为字段都来自不同的表,我认为可扩展性; 如果您可以在单独的表中轻松地将字段填充到每个记录的单行中,我将全文搜索而不是单个记录。您将得到一个不太复杂的FTS目录,您的查询一次不需要进行4次全文搜索。在同一时间在不同的表上运行大量单独的FTS查询是根据我的经验查询性能问题的一张票。这样做的缺点是你失去了自己搜索Surname的能力;如果这是你需要的东西,你可能需要看一个替代方案。

在我们的应用程序中,我们发现单个表更快(我们不能依赖手头有企业sql的客户);所以我们通过更新sp将带有空格的数据填充到FTS表中,然后我们的主要联系人查找在列表上运行搜索。我们有两个单独的搜索来处理精确查找事物(即姓名或电话号码)或仅用于自由文本。关于该表的另一个好处是,在查找中添加更多列是相对容易和低成本的(例如我们已经被要求提供社会安全号;为此我们只是将列添加到更新SP而我们离开了很少或没有影响。