如何一次跨多行使用SQL Server全文搜索?

时间:2010-05-12 07:05:36

标签: sql-server sql-server-2008

我正在尝试改进我的网络论坛上的搜索功能。我有一个帖子表,每个帖子都有(除了其他不那么有趣的东西):

  • PostID ,个别帖子的唯一ID。
  • ThreadID ,帖子所属线程的ID。每个帖子可以有任意数量的帖子。
  • 文字,因为没有它,论坛会很无聊。

我想编写一个有效的查询来搜索论坛中的线程以获取一系列单词,并且它应该返回任何包含所有搜索词的帖子的任何ThreadID的命中。例如,假设线程9的帖子1001中包含单词“cat”,并且还在其中发布了带有“hat”字样的1027。我想搜索 cat hat 以返回主题9的匹配。

这似乎是一个简单的要求,但我不知道有效的方法。使用N'cat AND hat'的常规FREETEXT和CONTAINS功能将不会返回上述示例中的任何匹配,因为单词存在于不同的帖子中,即使这些帖子在同一个帖子中。 (据我所知,当使用CREATE FULLTEXT INDEX时,我必须在主键PostID上给它我的索引,并且不能告诉它将具有相同ThreadID的所有帖子编入索引。)

我目前使用的解决方案有效,但很糟糕:维护一个单独的表,其中包含每个线程的整个连接后文本,并在THAT上创建一个全文索引。我正在寻找一种解决方案,不要求我在论坛中保留每个帖子的整个文本的副本。有任何想法吗?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

据我所知,没有“简单”的方法可以做到这一点。

我会创建一个存储过程,它只是简单地拆分搜索词并开始查找第一个单词并将threadid放在表变量中。然后在刚收集的线程中查找其他单词(如果有的话)(内连接)。

如果有兴趣我可以写一些代码,但我猜你不需要它。

答案 1 :(得分:0)

你正在寻找什么? CAT HAT作为一个完整的单词,在这种情况下:

CONTAINS(*,'"CAT HAT")

CAT或HAT然后..

CONTAINS (*,'CAT OR HAT')

搜索“CAT HAT”并期待只有CAT的帖子没有任何意义。如果问题是解析用户键入的内容,则可以用OR替换SPACES(搜索任何单词,如果需要则单击AND)。 OR将为你提供第9个帖子的帖子。

SELECT DISTINCT ThreadId
FROM Posts 
WHERE CONTAINS (*,'"CAT OR HAT")

更好的是,如果它有帮助,你可以使用将搜索字符串翻译(解析)为全文查询的精彩讽刺(http://irony.codeplex.com/)。可能对你有帮助。

要求在原始搜索中使用谷歌语法,这只是一件好事,因为大多数人习惯于在谷歌搜索中输入。

此处还有一篇关于如何使用它的文章。 http://www.sqlservercentral.com/articles/Full-Text+Search+(2008)/64248/