在达到详细信息之前,我想要广泛的指导方针,因此在两个问题上尽可能简短(这可能信息太少):
这个想法是找到匹配,返回供应商,显示排名,显示它所在的位置。如果我无法显示匹配,则结果不太明显,例如搜索“汽车”这个词会影响护理,汽车,心血管,卡等。用户可以输入多个单词,例如“汽车服务”。
FTS索引是否应仅在主数据表上的文本字段上,并且我在FTS字段上选择内部连接?我应该为这些创建视图和索引吗?如何显示热门单词?
答案 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}}。)