2009-01-25 254 views
29

比方說,我有一個相當簡單的應用程序,可以讓用戶在自己的DVD上存儲信息(標題,演員,年份,描述等),並且我想讓用戶搜索他們的收藏通過這些字段中的任何一個(例如「Keanu Reeves」或「The Matrix」將是有效的搜索查詢)。SQL全文檢索vs「LIKE」

使用SQL全文搜索與簡單地將查詢拆分爲空格並在SQL語句中執行一些「LIKE」子句有什麼區別?它只是表現更好還是會實際返回更準確的結果?

回答

27

全文搜索可能會更快,因爲它將受益於它將用於查找記錄的單詞索引,而使用LIKE則需要全表掃描。

在某些情況下,LIKE會更準確,因爲LIKE「%The%」和LIKE「%Matrix」會挑選出「Matrix」而不是「Matrix Reloaded」,而全文搜索將忽略「The」並返回兩者。這就是說這兩個可能會是一個更好的結果。

+0

我們不能創建一個字符[模式]的索引(https://www.postgresql.org/docs/9.5/static/indexes-opclass.html)嗎? – overexchange 2017-08-25 10:26:57

3

它會表現更好,但除非你有很多數據,否則你不會注意到這種差異。 SQL全文搜索索引使您可以使用更高級的操作符,然後執行簡單的「LIKE」操作,但如果您只是對全文索引執行LIKE操作,那麼結果將是相同的。

0

想象一下,是否允許在DVD上輸入註釋/說明。 在這種情況下,允許按說明進行搜索將會很好。 在這種情況下的全文搜索將會做得更好。

9

全文索引(這是索引)比使用LIKE(實質上每次檢查每行)快得多。但是,如果您知道數據庫很小,則可能不需要使用全文索引。確定這一點的唯一方法是使用一些智能平均和基於該信息的一些測試。

準確性是一個不同的問題。全文索引允許您使用LIKE在任何合理的時間範圍內執行一些操作(權重,自動匹配吃飯/吃飯/進食等)。真正的問題是你是否需要這些功能。

沒有閱讀全文文檔對這些功能的描述,你實際上並不知道應該如何繼續。所以,閱讀!另外,一些基本的測試(在表格中插入一堆行,可能帶有某種公用字典作爲單詞來源)將會幫助你做出決定。

0

你可能會得到稍微好一點的結果,或者至少有一個更容易的全文索引實現。但這取決於你想如何工作...

我腦海中想的是,如果你正在搜索兩個單詞,像LIKE你必須然後手動實現(例如)一個方法來重量與在名單上更高。全文索引應該爲你做這件事,並允許你使用相關的語法來影響權重。

7

全文搜索查詢速度更快。特別是在處理各種列中的大量數據時。

此外,您將有語言特定的搜索支持。例如。當「uber」存儲時,也會找到「über」中的「ü」這樣的德語變音符號。您也可以在自動展開搜索查詢的位置使用同義詞,或者替換或替換特定的短語。

在某些情況下,像會更準確 因爲LIKE「%的%」等「%黑客帝國」 將挑選出「黑客帝國」,而不是 「重裝上陣」,而全文 搜索將忽略「該「並返回 兩者。這表示兩者都可能有 是一個更好的結果。

這是不正確的。全文搜索語法可讓您指定要搜索的「如何」。例如。通過使用CONTAINS聲明,您可以使用精確詞語匹配以及模糊匹配,權重等。

因此,如果您有性能問題或希望提供更類似Google的搜索體驗,請進行全文搜索發動機。這也很容易配置。

6

就在幾個注意事項:

  1. LIKE可以使用索引查找,如果你不以%開始你喜歡的。例如:LIKE'Santa M%'很好! LIKE'%Maria'很糟糕!並可能導致表或索引掃描,因爲這不能以標準方式索引。

  2. 這是非常重要的。全文索引更新是異步的。例如,如果您在一個表上執行INSERT,然後在您希望顯示新數據的全文本搜索中執行SELECT,則可能無法立即獲取數據。根據您的配置,您可能需要等待幾秒鐘或一天。通常情況下,當您的系統沒有太多請求時,填充全文索引。

0

FullTextSearch在SQL Server作爲LIKE
首先,你必須創建一個StopList並將其分配給您的餐桌

CREATE FULLTEXT STOPLIST [MyStopList]; 
GO 
ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList] 
GO 

二,使用下面的TSQL腳本:

SELECT * FROM dbo.[MyTableName] AS mt 
WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"') 
0

如果您不只是搜索英文單詞,假設您搜索中文單詞,那麼您的英文單詞如何標記單詞使你的搜索有很大的不同,因爲我在這裏給出了一個例子https://stackoverflow.com/a/31396975/301513。但我不知道sql server如何標記中文單詞,它是否做得很好?