SQLServer 全文檢索(full-text)語法


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

5)查詢 varbinary(max) 和 xml 列

如果 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),'瑞士軍刀')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM