代码之家  ›  专栏  ›  技术社区  ›  dguaraglia

使SQL Server索引变小

  •  6
  • dguaraglia  · 技术社区  · 16 年前

    我们正在项目中使用SQL Server 2005。系统用户可以使用“关键字”搜索某些对象。我们实现这一点的方法是,为每个可能包含这些“关键字”的表中的重要列创建一个全文目录,然后使用“包含”来搜索用户在该索引的搜索框中输入的关键字。

    例如,假设你有电影对象,你想让用户在文章的标题和正文中搜索关键词,然后我们索引标题和绘图列,然后这样做:

    SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)
    

    (实际上比这要高级一点,但没有什么特别复杂的)

    一些用户正在向搜索中添加数字,例如,他们希望找到“Terminator 2”。这里的问题是,据我所知,默认情况下,SQL Server不会为短单词编制索引,因此执行如下搜索:

    SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')
    

    实际上相当于这样做:

    SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'
    

    我们得到了大量的虚假结果。

    是否有方法强制SQL Server索引小单词?最好,我只想做索引 数字 像1、2、21等,我不知道在哪里定义索引标准,甚至不知道是否可能如此具体。


    好吧,我做到了,从列表中删除了“干扰词”,现在行为有点不同,但仍然不是你所期望的。

    搜索不会找到“终结者2”(我只是在编造这个,如果我透露我们在做什么,我的雇主可能不会真的很高兴…不管怎样,术语有点不同,但原则是一样的),我不明白 任何东西 但我知道有些物体包含这两个词。

    也许我做错了什么?我删除了所有数字1…9从我的ENG、ENU和NEU(中性)噪声配置中,重新生成索引,并尝试搜索。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Darren Gosbell    16 年前

    这些“小词”被全文索引视为“干扰词”。您可以自定义干扰词列表。这个 blog post 提供更多详细信息。更改干扰词文件时,需要重新填充全文索引。

        2
  •  0
  •   Darren Gosbell    16 年前

    我知道噪声词文件,但我不是你的“终结者2”示例仍然给你带来问题的原因。你可能想试着问这个关于 MSDN Database Engine forum 专门从事这类事情的人常去的地方。

        3
  •  0
  •   xnagyg    16 年前

    您可以将contains(或containstable)与简单的where条件结合使用:

    从包含(标题,“终结者2”)和标题(如“%终结者2%)的电影中选择“*”

    当包含“查找所有终结符”时,其中将消除“终结符1”。

    当然,引擎足够智能,可以从包含非类似条件启动。