我有一个文件(在这种情况下发票)结构,其包含多个数据表:
Invoice Header
(第(PK),客户名称,客户地址,...)
Invoice Lines
(发票号(PK),号线(PK),描述,数量,...)
Invoice Header Comments
(发票号(PK),注释号(PK),注释)
当我运行一个搜索,我想执行它针对整个文件(作为一个实体,而不是针对单独的字段(客户名称+客户地址+说明+评论)。
例如:其中有一些是与“自行车和柏林”或“慕尼黑或柏林”或“‘快速交货’”所有文件....
什么方法你会建议来解决这个问题?
我应该创建一个单独的索引表来存储所有场串联的值,我想指数(客户名称,客户地址,简介,评论) - 每个文件一行:
文件索引 (文件编号(PK),索引)在这种情况下,我应该怎么养“文件索引”表最新的吗?
我试图创造出串联值索引视图,但到了限制 - 索引视图不能包含子查询,或者使用其他视图。
我希望所有的想法。
SQL全文搜索将是最合适的方法,因为你的布尔搜索,多列和表的要求。
该过程被分解为若干步骤,但大体上,你将需要:
- 创建全文目录
- 为每个表的全文索引
- 生成/建立索引
- 最后,在查询中使用的FT(目录)
我会强烈建议先从入门文章 ,它会帮助你了解一些专业术语,结构,以及如何管理和SQL Server中使用的全文。
如果需要排序(分数)或您的搜索结果进行排序,您应该创建一个新表,通过ETL过程,将所有的全文搜索的数据(发票头,行,注释),为您的实体为1柱。 这似乎是你与你的“文件索引”表的想法暗示什么。
为什么它们合并成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)
你怎么可以将它们变成1台? 您将需要某种形式的ETL过程中,其无论是在计划运行(这可能是更容易实现,但会导致滞后时间在您的全文索引不同步与主表)或大干快上的需求,只要您的主表运行被修改(通过触发器或通过挂钩到的事件数据中的层)。
文章来源: SQL Server Full-Text Search against Document (multiple related tables and field)