我正在尝试改进我的网络论坛上的搜索功能。我有一个帖子表,每个帖子都有(除了其他不那么有趣的东西):
我想编写一个有效的查询来搜索论坛中的线程以获取一系列单词,并且它应该返回任何包含所有搜索词的帖子的任何ThreadID的命中。例如,假设线程9的帖子1001中包含单词“cat”,并且还在其中发布了带有“hat”字样的1027。我想搜索 cat hat 以返回主题9的匹配。
这似乎是一个简单的要求,但我不知道有效的方法。使用N'cat AND hat'的常规FREETEXT和CONTAINS功能将不会返回上述示例中的任何匹配,因为单词存在于不同的帖子中,即使这些帖子在同一个帖子中。 (据我所知,当使用CREATE FULLTEXT INDEX时,我必须在主键PostID上给它我的索引,并且不能告诉它将具有相同ThreadID的所有帖子编入索引。)
我目前使用的解决方案有效,但很糟糕:维护一个单独的表,其中包含每个线程的整个连接后文本,并在THAT上创建一个全文索引。我正在寻找一种解决方案,不要求我在论坛中保留每个帖子的整个文本的副本。有任何想法吗?我错过了一些明显的东西吗?
答案 0 :(得分:1)
据我所知,没有“简单”的方法可以做到这一点。
我会创建一个存储过程,它只是简单地拆分搜索词并开始查找第一个单词并将threadid放在表变量中。然后在刚收集的线程中查找其他单词(如果有的话)(内连接)。
如果有兴趣我可以写一些代码,但我猜你不需要它。
答案 1 :(得分:0)
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/