sql server 全文檢索有兩種搜索方式,一種是contains,另一種是freetext。前者是包含,類似於like '%關鍵詞%',后者則是將一段文字分詞以后對每個詞進行搜索。
具體語法:
contains: SELECT 字段1,字段2 FROM 表名 WHERE contains(字段,'"詞一" or "詞二"') 根據查找結果的相似度排序 SELECT 字段1,字段2 FROM 表名 inner join containstable(表名, 字段,'"詞一" or "詞二"',10) as k on 表名.id = k.[key] order by k.RANK DESC freetext: SELECT 字段1,字段2 FROM 表名 WHERE freetext(字段,'詞一詞二') 根據查找結果的相似度排序 SELECT 字段1,字段2 FROM 表名 inner join freetexttable(表名, 字段,'詞一詞二',10) as k on 表名.id = k.[key] order by k.RANK DESC
上文中freetexttable或containstable的10表示取10條數據
具體詳細操作:
數據庫數據執行任意文本查詢:
1.使用FREETEXT謂詞 FREETEXT接受兩個參數。
第一個參數表示要搜索的列,可以提供列名,或者用*字符搜索表中的所有列。
第二個參數表示要搜索的短語。
例: select Title from Titles where FREETEXT(Title,'secret computer')
該SQL語句將數據庫表Titles中的Title列中的內容包括secret或computer的紀錄查詢出來 。
2.使用FREETEXTTABLE函數 FREETEXTTABLE接受三個參數。
第一個參數表示要搜索的表,
第二個參數表示要搜尋的列,
第三個參數表示要搜索的短語。它返回一個表,表中包含KEY和Rank兩列,key表示與此匹 配相關聯的紀錄的惟一鍵。rank表示結果與查詢的匹配程度,1000表示最佳,0表示最差。
例:select * from Freetexttable(Titles,Title,'a book about silicon valley') searchTable
此SQL語句返回表searchTable,表中有兩列,key和rank。
數據庫數據的布爾查詢:
1.使用CONTAINS謂詞
CONTAINS接受兩個參數:要搜索的列和搜索短語。
1)搜索特定的詞或短語(簡單詞)
例:select Title from Titles where contains(Title,'computer and not cooking')
此例返回title里包含computer的紀錄不返回包含cooking的紀錄,因為 and not。
如果短語中有詞組
如:select student_id,student_name from students where CONTAINS( address, '"HEIBEI province"' );也可以用CONTAINS( address, '"HEIBEI province"' )
2)執行前綴搜索(前綴詞)
如果查詢以‘hu’開頭的地址:
SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"hu*"' )
這里是‘*’,而不是‘%’。
3)搜索特定詞的變形(派生詞)
1 1SELECT Comments, ReviewerName 2 FROM Production.ProductReview3 3 WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')
4)使用加權值搜索詞或短語(加權詞)
1 SELECT AddressLine1, KEY_TBL.RANK 2 FROM Person.Address AS Address INNER JOIN 3 CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*", 4 Street WEIGHT(0.9), 5 View WEIGHT(0.1) 6 ) ' ) AS KEY_TBL 7 ON Address.AddressID = KEY_TBL.[KEY] 8 ORDER BY KEY_TBL.RANK DESC
如果 varbinary(max)、varbinary 或 xml 列是全文索引列,則與任何其他全文索引列一樣,可以使用全文謂詞(CONTAINS 和 FREETEXT)以及函數(CONTAINSTABLE 和 FREETEXTTABLE)來查詢該列。
單個 varbinary(max) 或 varbinary 列可以存儲多種類型的文檔。 SQL Server 支持安裝了相應篩選器並且在操作系統中可用的任何文檔類型。 每個文檔的文檔類型由該文檔的文件擴展名標識。 例如,對於 .doc 文件擴展名,全文搜索將使用支持 Microsoft Word 文檔的篩選器。
全文引擎可以利用操作系統中安裝的現有篩選器。 在您可以使用操作系統篩選器、斷字符和詞干分析器之前,您必須將它們加載到服務器實例中,如下所示:
EXEC sp_fulltext_service @action='load_os_resources', @value=1
--varbinary(max) 或 varbinary 數據
若要對 varbinary(max) 列創建全文索引,全文引擎需要訪問 varbinary(max) 列中文檔的文件擴展名。 此信息必須存儲在一個稱為“類型列”的表列中,該列必須與全文索引中的 varbinary(max) 列相關聯。 在為文檔創建索引時,全文引擎將使用類型列中的文件擴展名來標識要使用的篩選器。
--xml 數據
xml 數據類型列僅存儲 XML 文檔和片段,並且只有 XML 篩選器用於此類文檔。 因此,無需類型列。 在 xml 列上,全文索引會為 XML 元素的內容創建索引,但會忽略 XML 標記。 不為數值的屬性值都會進行全文索引。 元素標記用作標記邊界。 支持包含多種語言的格式正確的 XML 或 HTML 文檔和片段。
6)使用布爾運算符 – AND、OR 和 NOT – 在 CONTAINS 和 CONTAINSTABLE 中
CONTAINS 謂詞和 CONTAINSTABLE 函數使用相同的搜索條件。 它們都支持使用布爾運算符(AND、OR、AND NOT)將多個搜索詞組合起來,以執行邏輯運算。 例如,可以使用 AND 查找既包含“latte”又包含“New York-style bagel”的行。 例如,可以使用 AND NOT 查找包含“bagel”但不包含“cream cheese”的行。
SELECT Description FROM Production.ProductDescription WHERE ProductDescriptionID <> 5 AND CONTAINS(Description, 'aluminum AND spindle')
2.使用CONTAINSTABLE謂詞 CONTAINSTABLE接受三個參數:
要搜索的表,要搜索的列和搜索的短語.
例:select * from containstable ( Titles,Title,'Cooking AND NOT Computer')
該例返回包含key和rank兩列的表
FREETEXTTABLE 語法:
FREETEXTTABLE 是一個函數,用於在 Transact-SQL SELECT 語句的 FROM 字句中對包含基於字符的數據類型的全文索引列執行 SQL Server 全文搜索
語法
FREETEXTTABLE(Table_Name,Column_Name,Language)
Table_Name 表名,需要全文搜索的表名
Column_Name 列名,可以有多個列名中間用逗號隔開
Language 需要搜索的文字
例如:
FREETEXTTABLE([GCP.Product].[ProductPublished],(Name,Keywords),'瑞士軍刀')
通過查詢 SELECT * FROM FREETEXTTABLE([GCP.Product].[ProductPublished],(Name,Keywords),'瑞士軍刀')
