2010-05-12 73 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