【问题标题】:Is there an efficient way to index inside words in SQL server 2008?有没有一种有效的方法来索引 SQL Server 2008 中的单词?
【发布时间】:2009-11-18 19:19:59
【问题描述】:

我们的系统中有一些查询使用 LIKE '%'+@SomeCriteria+'%' 来搜索人名。在这种情况下,我们正在讨论 VARCHAR(50) 字段。我们真的很想让我们的用户能够在名称中进行搜索。

按照我的理解,如果我们搜索名称的第一部分,索引字段只会使这更快,而全文索引将搜索特定的单词,但据我所知,什么时候没有帮助在单词中搜索。

SQL 2008 中是否有一种很好的方法可以有效地在单词内部搜索给定条件,而无需进行完整的表扫描?我是否注定要提出复杂的自定义方法或查询一直很慢?

【问题讨论】:

    标签: sql sql-server-2008 indexing


    【解决方案1】:

    好吧,使用Full Text Search 可以解决问题(编辑:请参阅下面的 cmets,这 对后缀/中期搜索有效),但对于您的情况可能有点过头了(或者可能不是)。正如您已经提到的那样,索引的帮助很小,尽管正如@Aaron 已经提到的那样,它在 2k5 中有所改进(唯一有帮助的其他方式是,如果您有一个覆盖的非聚集索引,它将被扫描与集群相比,这将仅当非聚集索引的原始大小实际上较小时才有帮助,即要扫描的数据较少)。

    可能的自定义解决方案是从您正在搜索的字符列创建一个computed column 并保留/索引它,但这只有在您搜索字符串的设定位置或组件时才真正可行/有用(例如例如,如果您正在搜索诸如电子邮件字段之类的内容,您可以创建一个计算列,该列仅对电子邮件地址的域部分进行模式匹配/具体化,然后对其进行持久化/索引并在那里查询)。

    【讨论】:

    • 对于电子邮件,另一种方法是分别存储本地部分和域名,并保存连接的电子邮件地址,或者通过视图将其具体化。我通常会尽可能减少存储空间。
    • 嘿 chadhoc,你说全文搜索可以解决问题。全文搜索不会将索引分解为单词吗?那么,如果我想在一个字段中搜索 chadhoc 的“adhoc”部分,这实际上会有所帮助吗?
    • 好点 - 它不仅仅是单词(例如,您可以查询前缀、屈折变化、单词/短语接近度、同义词等形式),但据我所知 可以'不 做后缀和/或期中匹配(即不在术语开头的单词片段)。
    【解决方案2】:

    我们曾经做过的有助于降低查询速度的做法是,我们有一个存储过程,它运行两段代码而不是一段代码。首先,我们进行了完全匹配搜索,然后仅在完全匹配搜索没有返回结果时才进行不精确搜索(或者在一种情况下,如果完全匹配搜索返回的结果少于 5 个)。这样一来,愿意输入全名的用户得到了快速响应,而那些只想输入几个字符的用户得到了较慢的响应。你也可以用三种可能性来做到这一点,完全匹配、仅在末尾不精确匹配和在前端和末尾不精确匹配。

    【讨论】:

      【解决方案3】:

      这在 SQL Server 2005 中得到了改进,但您无法直接控制它...

      http://technet.microsoft.com/en-us/library/cc966419.aspx#XSLTsection131121120120

      【讨论】:

        【解决方案4】:

        过去,我使用Soundex 取得了很大的成功。我要求美国人需要搜索听起来相似的东欧姓氏,例如Elanov/Ilanov/Yllanov 将具有相似的 Soundex 签名。

        【讨论】:

        • 这是一个很酷的主意,马特。我以前没有听说过。我不确定我是否可以在这里使用它,但我以后必须牢记这一点。
        猜你喜欢
        • 2011-04-25
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多