2012-07-18 196 views
0

我們正在將我們的應用程序的數據庫遷移到Windows Azure SQL數據庫。在應用程序中,有幾個輕量級搜索函數,我們目前使用T-SQL和全文索引來處理搜索。但是,全文索引目前在Azure中不可用。沒有全文索引的SQL搜索

我正在研究非SQL解決方案,如Lucene.Net,這看起來不錯,但我認爲它可能是我們正在嘗試做的事情的矯枉過正。我們搜索的數據集並不大 - 平均少於100,000條記錄 - 並且只有少數幾個。一個示例表可能看起來像這樣...

CREATE TABLE dbo.Items(
    [ItemID] [int] IDENTITY(1,1) NOT NULL, 
    [Author] [varchar](255) NULL, 
    [Subject] [varchar](255) NULL, 
    [ItemContent] [nvarchar](max) NULL, 
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([ItemID] ASC) 
) 

...我們想要搜索作者,主題和ItemContent字段。作者和主題可以是多個單詞,而ItemContent字段可以有幾個段落,所以我看不到我如何避免表掃描。全文索引表現非常好,我不期待:

SELECT ItemID FROM dbo.Items WHERE作者LIKE'%'+ @SearchTerm +'%'OR主題LIKE'%'+ @ SearchTerm +'%'或ItemContent LIKE'%'+ @SearchTerm +'%'

任何人都有如何優化此類型的搜索而不使用全文索引的建議嗎?

+0

什麼樣的搜索,你期待着做.. 。如果你想搜索像「herman melvi lle moby dick「,lucene會記住這一點,但是你的搜索查詢不會......你確定你不需要lucene-ish解決方案嗎? – Rikon 2012-07-18 02:13:18

+0

我喜歡Lucene,因爲它確實是一個「搜索」解決方案,它絕對是在運行。也就是說,到目前爲止,我們的全文索引查詢對於此特定任務運行良好 - 查詢往往是快速的過濾器類型查詢,而不是更復雜的搜索字符串。所以如果我能從T-SQL解決方案中獲得良好的性能,我會傾向於這個方向。 – 2012-07-18 05:49:16

回答

0

另一種方法是創造,如果沒有一個完整的數據倉庫解決方案,也許是被改寫的這些列到一個單一的記錄(或更少的記錄)一些非規範化的表...所以你有一個數據庫表瓦特/只項目Id | CombinedSearchableInfo在您CombinedSearchableInfo可能是「赫爾曼·梅爾維爾白鯨」,在這種情況下,你正在做的更少的計算工作(你可以使用不同的查詢優化技術類似的東西)。你只需要維護你的搜索表w /一個脫機進程...

請記住,雖然Lucene可以幫助瓦特/事情如拼寫錯誤和相關性,並與像書籍和作者的域名空間,拼寫錯誤很有可能...

(此外,如果你要去蔚藍的路線,現在可以有很多東西w /表格存儲和blob存儲......你可以運行你的sql服務器w/full文本索引作爲你的blob存儲的一部分,不必改造任何東西......你會失去所有性能優勢的天青SQL,但嘿...這是一個選項)

+0

感謝您的建議。我正在尋找類似的選擇。您如何看待索引視圖而不是表格,其中「CombinedSearchableInfo」是來自我想要搜索的列的連接內容?我的理解是,如果我爲視圖編制索引並用(NOEXPAND)查詢,它本質上就像表格一樣執行。當然,它仍然是一個掃描 - 我想是希望如果掃描只看一列,它會表現更好。 – 2012-07-18 05:56:22