【问题标题】:SQL Server: simulate full-text search - other ways to do similar searchesSQL Server:模拟全文搜索 - 进行类似搜索的其他方法
【发布时间】:2013-02-14 07:43:08
【问题描述】:

我创建了全文目录并尝试创建全文索引,但我尝试过的任何方法都失败了。好吧,我联系了我的网络托管支持以寻求帮助,并了解到他们尚未安装该功能。

现在我应该以某种方式模拟全文搜索。我想要做的是,在文本中搜索多个单词。我知道一些方法,但性能是我关心的问题。

select * 
from messages 
where msgbody like '%word1%' 
  and msgbody like '%word2%' 
  and ... 
  and msgbody like '%wordn%'

我想到的另一种方法(因为我的搜索只有and类型而没有or)是搜索一个单词,然后在第一次搜索和第三次搜索的结果中搜索第二个单词第二次搜索的结果等等。但这看起来也不是一个好的选择。

【问题讨论】:

  • 由于您使用LIKE '%.....%' 进行搜索 - 性能非常糟糕,因为 SQL Server 将无法使用任何可能存在的索引......
  • @marc_s 这正是我寻找另一种方式的原因。我想到的另一种方法(因为我的搜索只是并且输入不是或)是搜索一个单词,然后在第一次搜索的结果中搜索第二个单词,在第二次搜索的结果中搜索第三次搜索,依此类推。但这看起来也不是一个好的选择
  • 如果 like '%word1%' 糟糕到无法接受,并且您无法安装 FTS 或移动到已安装它的主机上,那么您需要通过解析各个单词并索引这些单词来推出自己的messageid.
  • @MartinSmith 能否提供代码,我该怎么做?
  • @AshkanMobayenKhiabani - 没有任何方便。我似乎记得 Dot Net Nuke 做了类似的事情。

标签: sql-server full-text-search


【解决方案1】:

如果您确定要寻找新的主机(不要责怪您),您可以使用 String.Split() 之类的东西为您提供一个数组(按空格字符分割)。然后,您会将所有这些字符串添加到“单词”表或类似的东西中。建立一个单一的“单词”表和一个链接表会更适合参考,如下所示:

create table TheWords
    (
    TheWord NVARCHAR(32) NOT NULL ,
        CONSTRAINT PKC_TheWords
        PRIMARY KEY CLUSTERED ( TheWord ) ,
    TheWordID INT IDENTITY (1,1) NOT NULL
    )

create table WordsInMsgBody
    (
    MsgBodyID INT NOT NULL ,
        CONSTRAINT FK_MsgBodyID@WordsInBody
        FOREIGN KEY ( MsgBodyID )
        REFERENCES dbo.MsgBody ( MsgBodyID ) ,
    TheWordID INT NOT NULL ,
        CONSTRAINT FK_TheWordID@WordsInBody
        FOREIGN KEY ( TheWordID )
        REFERENCES dbo.TheWords ( TheWordID ) ,
        CONSTRAINT PKC_WordsInBody
        PRIMARY KEY CLUSTERED ( MsgBodyID , TheWordID )
    )

如果您对特定单词的 多少 包含在消息中感兴趣,可以省略最终约束 (PKC_WordsInBody)。如果不是,请将其设为主键并仅将单词的单个实例插入链接表。

但是,您将不得不做一些工作来实现这一点 - 解析消息正文,插入以前从未见过的单词,并将记录插入链接表中需要工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多