链接子表和父子表的SQL全文索引

时间:2015-11-23 19:33:24

标签: sql sql-server full-text-search

在达到详细信息之前,我想要广泛的指导方针,因此在两个问题上尽可能简短(这可能信息太少):

  1. 供应商有多个地址。地址由字段组成。地址第1行和第2行是自由文本。其余的是掌握具有FK和名称的数据表的关键。 Id到国家。 Id到省。 ID到市政当局。 ID到城市。 ID到郊区。我想在地址第1行和第2行以及所有主数据表名称列中使用FTS,以便用户可以找到地址与其捕获的地址相匹配的供应商。因此,这跨越各种主数据表。请注意,省或郊区等不仅是单个词,例如草地公园。
  2. 供应商提供许多商品和服务。这些商品和服务是父级和子级商品的4级层次结构(UNSPSC)。货物或服务处于4级层次结构的最低级别,但也应返回较高级别的命中。供应商链接到最低层次结构。希望利用FTS找到在4级层次结构中提供商品和服务的供应商。
  3. 这个想法是找到匹配,返回供应商,显示排名,显示它所在的位置。如果我无法显示匹配,则结果不太明显,例如搜索“汽车”这个词会影响护理,汽车,心血管,卡等。用户可以输入多个单词,例如“汽车服务”。

    FTS索引是否应仅在主数据表上的文本字段上,并且我在FTS字段上选择内部连接?我应该为这些创建视图和索引吗?如何显示热门单词?

1 个答案:

答案 0 :(得分:1)

FTS索引是否应该只在主数据表上的文本字段上开启......?

当您在多个表中有字段需要在单个查询中进行搜索然后排名时,最佳做法是通过ETL过程将这些字段组合到单个字段中。 I recently posted an answer我解释了这种方法的好处:

  

为什么要将它们合并到一个表中?这种方法比将全文索引应用于每个现有索引的排名更好   表。前一种解决方案产生单一等级而后者则产生   将为每个表产生不同的排名,并且没有准确的   解决多个等级的方式(基于完全不同的等级)   比例)分为1级。 ...

     

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

如何显示匹配的字词?

不幸的是,SQL Server全文没有提取或突出显示在搜索期间匹配的单词/短语的功能。 this question的答案提供了有关如何推广自己的解决方案的提示。还有一个名为ThinkHighlight的第三方产品,它是一个CLR程序集,有助于突出显示(我从来没有使用它,所以我无法保证它。)

...搜索单词" car"会照顾到护理,汽车,心血管,卡片......

你没有明确地询问这一点,但你应该知道默认情况下" car"不会匹配"关心"等等。您要做的是通配符搜索。您的全文查询需要使用星号,并且应该如下所示:SELECT * FROM CONTAINSTABLE(MyTable, *, '"car*"')请注意,通配符仅在使用CONTAINS / CONTAINSTABLE(布尔搜索)时可用,而不是FREETEXT 1}} / FREETEXTTABLE(自然语言搜索)。根据您描述用例的方式,听起来您需要修改用户的搜索字符串以添加通配符。如果您使用CONTAINS / CONTAINSTABLE来添加布尔运算符和引号(例如:用户类型car service),您无论如何都需要执行此操作。您将其更改为{{ 1}}。)