SQL Server对文档的全文搜索(多个相关表和字段)

时间:2015-11-01 20:21:07

标签: sql-server full-text-search fulltext-index full-text-catalog

我有一个包含多个表的文档(在本例中为Invoice)结构:

  • Invoice Header(编号(PK),客户名称,客户地址,......)

  • Invoice Lines(发票编号(PK),行号(PK),说明,数量,......)

  • Invoice Header Comments(发票编号(PK),评论编号(PK),评论)

当我运行搜索时,我想针对整个文档执行它(作为一个实体,而不是针对单独的字段(客户名称+客户地址+描述+注释)。

示例:所有与“Bicycle AND Berlin”或“Munich OR Berlin”或“'Fast delivery'”有关的文件....

您建议采用什么方法来解决此问题?

我应该创建一个单独的索引表来存储我想索引的所有字段的连接值(客户名称,客户地址,描述,注释) - 每个文档一行:

文件索引(文件编号(PK),索引) 在这种情况下,我应该如何更新“文档索引”表?

我尝试创建连接值的索引视图,但是达到了限制 - 索引视图不能包含子选择或使用其他视图。

我很感激所有的想法。

2 个答案:

答案 0 :(得分:0)

根据您对布尔搜索,多列和表的要求,SQL全文搜索是最合适的方法。

这个过程分为几步,但粗略地说,你需要:

  1. 创建全文目录
  2. 为每个表格创建全文索引
  3. 生成/构建索引
  4. 最后,在查询中使用FT(目录)
  5. 我强烈建议从Getting Started article开始,它将帮助您了解一些术语,结构以及如何在SQL服务器中管理和使用全文。

答案 1 :(得分:0)

如果您需要对搜索结果进行排名(评分)或排序,您应该创建一个新表,通过ETL过程,将所有可全文搜索的数据(发票标题,行,注释)组合在一起实体分为1列。这似乎就是您对“文档索引”表格的建议。

为什么要将它们合并到一个表中?与将全文索引应用于每个现有表格相比,这种方法的排名更高。前一种解决方案产生单一等级,而后者将为每个表产生不同的等级,并且没有准确的方法将多个等级(基于完全不同的等级)解析为1等级。为了说明不同之处:

-- Querying 1 table
SELECT RANK, KEY FROM CONTAINSTABLE(DocumentIndex.*, @searchString)

-- Querying multiple tables (this results in multiple rank values which cannot be resolved into a single rank)
SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceHeader.*, @searchString)

SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceLines.*, @searchString)

SELECT RANK, KEY FROM CONTAINSTABLE(InvoiceHeaderComments.*, @searchString)

如何将它们合并到一个表中?您需要某种ETL流程,这些流程要么按计划运行(这可能更容易实现,但会导致延迟时间在您的全文中index与主表不同步)或者在修改主表时(通过触发器或挂钩到数据层中的事件)按需运行。