2010-05-12 70 views
6

我正在尝试改进我的网络论坛上的搜索功能。我有职位表,每个岗位有(其中包括少有趣的事情):如何一次使用跨多行的SQL Server全文搜索?

  • 帖子ID,对个人职位的唯一ID。
  • 主题ID,帖子所属帖子的ID。每个线程可以有任意数量的帖子。
  • 文字,因为没有它,论坛会很无聊。

我想写一个高效的查询,将搜索的线程在论坛进行了一系列的话,它应该返回一个命中任何线程ID为其中有职位,包括所有的搜索词。例如,假设线程9的帖子1001中包含单词“cat”,并且还在单词“hat”中包含1027。我想要搜索猫的帽子返回一个线程9命中。

这似乎是一个简单的要求,但我不知道有效的方式来做到这一点。在上面的例子中,使用常规的FREETEXT和CONTAINS能力来处理N'cat AND hat'不会返回任何结果,因为这些单词存在于不同的帖子中,即使这些帖子在同一个线程中。 (据我所知,当使用CREATE FULLTEXT INDEX时,我必须将它作为主键PostID的索引,并且不能告诉它索引具有相同ThreadID的所有帖子。)

解决方案我现在有工作,但很糟糕:维护一个单独的表,其中包含每个线程的整个连接后的文本,并在该表中创建全文索引。我正在寻找一种解决方案,不需要我在论坛中保存每个线程的整个文本的副本。有任何想法吗?我错过了明显的东西吗?

+0

您是如何解决这个问题的?您是如何解决单独表格的65535个字符的TEXT限制问题的? – mgutt 2015-04-11 21:44:40

回答

1

据我所见,没有“简单”的方法来做到这一点。

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

如果intrested我可以写一些代码,但即时猜测你不会需要它。

+0

这是我可以提出的最好的“智能”解决方案。我已经自己解析了用户的输入(所以他们不必在每个单词之间加上“AND”,并且稍微消毒一些东西),所以我可以在多个阶段进行搜索,每次都缩小搜索结果搜索词。 我真的不知道“聪明”是如何,因为我不是一个数据库家伙,但它当然似乎更适合我目前的解决方案。我已经有了一个伪代码,这让我头脑中浮现出来。 – Travis 2010-05-12 19:00:29

0

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

CONTAINS(*,'"CAT HAT") 

猫或HAT的话..

CONTAINS (*,'CAT OR HAT') 

搜索 “CAT帽子”,并期望只是CAT后在不使任何意义。如果问题是解析用户输入的内容,则可以用OR替换空格(搜索任何单词,如果两者都需要)。该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/

+0

也许我的问题不清楚;我不想太罗嗦。我有CONTAINS()查询现在正常工作。用户输入“猫帽子”,然后将其翻译为“猫和帽子”,以便在CONTAINS()中使用。我所需要的并不是从基本的CONTAINS()中获取,而是能够搜索多行(帖子)中给出的作为单个单元(线程)处理的术语。如果表中所有包含单个线程ID的帖子中的所有搜索项都存在于这些帖子的某处,即使不是全部在同一帖子中,查询也应返回该线程ID的命中。 – Travis 2010-05-12 19:03:59

+0

你的意思是猫可以在一个职位和帽子在另一个?如果那样的话那么你的查询不是“CAT或HAT”? – 2010-05-13 15:25:08

+0

CAT可以在一个中,而HAT可以在另一个中,但是所有单词必须存在于单个线程中以便匹配。 – Travis 2010-05-13 16:01:15