SQL Server - 多列子字符串匹配

时间:2010-03-12 23:28:36

标签: sql sql-server-2005 sql-server-2008 search

我的一个客户端迷上了多列子字符串匹配。

我了解ContainsFreeText搜索字词(至少在包含字词前缀的情况下)。但是,根据我对this MSDN书籍的理解,这些及其变体都不能搜索子字符串。

我使用LIKE相当广泛(从A中选择*,其中A.B喜欢'%substr%')

样本表A:

ID | Col1     | Col2     | Col3     |
-------------------------------------
1  | oklahoma | colorado | Utah     |
2  | arkansas | colorado | oklahoma |
3  | florida  | michigan | florida  |
-------------------------------------

以下代码将为我们提供第1行和第2行:

 select * from A where Col1 like '%klah%' or Col2 like '%klah%' or Col3 like '%klah%'

这相当丑陋,可能很慢,我只是不喜欢它。可能是因为我正在处理的实现有10多个需要搜索的列。

随着代码可读性的提高,以下内容可能略有改善,但就性能而言,我们仍然处于同一个球场。

 select * from A where (Col1 + ' ' + Col2 + ' ' + Col3) like '%klah%'

我已经考虑过简单地添加插入,更新和删除触发器,只需将上面列的连接版本添加到一个单独的表中即可隐藏此表。

示例Shadow_Table:

ID | searchtext                 |
---------------------------------
1  | oklahoma colorado Utah     |
2  | arkansas colorado oklahoma |
3  | florida michigan florida   |
---------------------------------

这将允许我们执行以下查询以搜索'%klah%'

select * from Shadow_Table where searchtext like '%klah%'

我真的不想记住这个影子表存在,并且当我执行多列子字符串匹配时我应该使用它,但它可能会以写入和存储为代价产生非常快速的读取空间。

我的直觉告诉我,SQL Server 2008中已经存在一个现有的解决方案。但是,我似乎无法找到关于该主题的研究论文以外的任何内容。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据您的描述,您似乎正在寻找一种改进精确搜索的方法。当您尝试查找与字符串完全匹配的字符串时,LIKE是正确的工具。如果你担心性能,那么你应该考虑索引,甚至是你所描述的自定义索引。

也许考虑一个持久的计算列而不是影子表。插入/更新的开销应小于使用触发器,查询时间可能相同。

全文搜索

全文搜索被设计为自然语言搜索。

从最终用户角度考虑。如果我正在寻找“俄克拉荷马”,我可能会以“okla”或“ok”或“oklahoma”开头。我不会搜索“homa”。这是我们人类思维方式的思考方式。因此,“自然”语言搜索。

自然语言搜索使用根词干和类似词语来增加结果总数。但是,如果您希望所有结果与您的搜索字词特别匹配,则不是最佳选择:例如自由文本将与“驾驶和课程”匹配“我开车上课”,即使这两个单词都没有明确出现。