我有一个包含多个表的文档(在本例中为Invoice)结构:
Invoice Header
(编号(PK),客户名称,客户地址,......)
Invoice Lines
(发票编号(PK),行号(PK),说明,数量,......)
Invoice Header Comments
(发票编号(PK),评论编号(PK),评论)
当我运行搜索时,我想针对整个文档执行它(作为一个实体,而不是针对单独的字段(客户名称+客户地址+描述+注释)。
示例:所有与“Bicycle AND Berlin”或“Munich OR Berlin”或“'Fast delivery'”有关的文件....
您建议采用什么方法来解决此问题?
我应该创建一个单独的索引表来存储我想索引的所有字段的连接值(客户名称,客户地址,描述,注释) - 每个文档一行:
文件索引(文件编号(PK),索引) 在这种情况下,我应该如何更新“文档索引”表?
我尝试创建连接值的索引视图,但是达到了限制 - 索引视图不能包含子选择或使用其他视图。
我很感激所有的想法。
答案 0 :(得分:0)
根据您对布尔搜索,多列和表的要求,SQL全文搜索是最合适的方法。
这个过程分为几步,但粗略地说,你需要:
我强烈建议从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与主表不同步)或者在修改主表时(通过触发器或挂钩到数据层中的事件)按需运行。