1

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

  • Invoice Header(编号(PK)、客户名称、客户地址……)

  • Invoice Lines(发票编号(PK),行号(PK),描述,数量,...)

  • Invoice Header Comments(发票编号 (PK)、注释编号 (PK)、注释)

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

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

你会推荐什么方法来解决这个问题?

我是否应该创建一个单独的索引表来存储我想要索引的所有字段的连接值(客户姓名、客户地址、描述、评论) - 每个文档一行:

文档索引(文档编号(PK),索引)在这种情况下,我应该如何保持“文档索引”表是最新的?

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

我会很感激所有的想法。

4

2 回答 2

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 过程,该过程要么按计划运行(这可能更容易实现,但会导致全文索引与主表不同步的延迟时间)或在主表时按需运行被修改(通过触发器或通过挂钩到数据层中的事件)。

于 2015-11-02T14:28:00.410 回答
0

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

该过程分为几个步骤,但大致而言,您需要:

  1. 创建全文目录
  2. 为每个表创建一个全文索引
  3. 生成/构建索引
  4. 最后,在查询中使用 FT(目录)

我强烈建议您从入门文章开始,它将帮助您了解一些行话、结构以及如何在 SQL Server 中管理和使用全文。

于 2015-11-01T21:06:35.267 回答