[鐵人賽][Denali 新特性探險17]Semantic Search(2)
上一篇我大概介紹了Semantic Search功能,也示範了該如何安裝及註冊Semantic Search,
這篇我們繼續來看如何使用Semantic Search及建立所需注意事項。
Semantic Indexes注意事項
1. 資料庫必須有全文檢索目錄。
2. 資料表必須有全文檢索索引。
3. 所選擇的欄位必須已存在文檢索索引。
4. 所選擇語言必須有支援(透過sys.fulltext_semantic_languages 確認)。
5. 所選擇欄位資料類型必須有支援(char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max) 都可)。
6. 如果沒有明確指定語言,那Semantic Indexes將以主要語言和相關語言語意進行統計和擷取。
7. 所選擇文件類型必須有支援(透過 sys.fulltext_document_types確認)。
8. 有兩種行為,key phrases 和document similarity ,你無法只指定單一行為,但你可以個別使用單一行為進行查詢。
這裡我將利用之前所建立的 FileTable 來示範如何使用Semantic Search
FileTable文件來源
1.建立Semantic Indexes
先確認Semantic Search所支援文件類型
select *
from sys.fulltext_document_types
where document_type in ('.pdf','.docx','.doc','.ppt','.pptx')
可以看到文件類型少了.docx、.pptx、pdf。
接下來,針對相關缺少的文件類型變更篩選清單。
安裝office filter packages(支援.docx 、.pptx)
安裝 Adobe PDF iFilter (支援.pdf)
安裝成功後執行以下TSQL變更篩選清單(詳細可參考 如何:更改已註冊的斷詞工具和篩選清單 (Transact-SQL))
--重新載入作業系統篩選和斷詞工具
exec sp_fulltext_service @action= 'load_os_resources', @value= 1
--重新啟動篩選背景程式主機處理序 (fdhost.exe)
exec sp_fulltext_service 'restart_all_fdhosts';
重新啟動SQL Services後再次確認文件類型
這時我們可以看到 docx、pdf和pptx文件類型了。
上述確認完畢後,下面我們繼續來建立全文檢索目錄和Semantic Indexes(兩種方法1:使用SSMS 2.使用TSQL)。
建立全文檢索目錄和Semantic Indexes(Using SSMS)
勾選統計語意。
選擇自動變更追蹤。
新增特定全文檢索目錄。
建立成功。
建立全文檢索目錄和全文檢索索引含Semantic Indexes(Using TSQL)
create fulltext index on dbo.Mydocs
(name
language 1028 STATISTICAL_SEMANTICS,
file_stream
type column file_type
language 1028 STATISTICAL_SEMANTICS)
key index PK_Mydocs_5A5B77D56E0F5D8F
on MyFTDocs
WITH
change_tracking auto,
stoplist = system;
建立成功後,確認Semantic Search是否OK
--確認Semantic Search是否OK
select * from sys.dm_fts_index_population
where table_id =OBJECT_ID('dbo.Mydocs')
select * from sys.dm_fts_semantic_similarity_population
where table_id =OBJECT_ID('dbo.Mydocs')
Status=Starting 。
確認Status=Starting後,我們就可以執行Semantic Search。
使用 semantickeyphrasetable: 查看該FileTable目前全部關鍵詞組
select keyp.keyphrase
from semantickeyphrasetable
(
dbo.Mydocs,
file_stream
) as keyp
order by keyp.score desc
(擷取部分)。
使用semantickeyphrasetable: 搜尋(前30筆)相關文件內容中”效能”詞組。
select top(30) ft.name,ft.cached_file_size,keyp.keyphrase,keyp.score
from dbo.Mydocs as ft
inner join semantickeyphrasetable
(
dbo.Mydocs,(name,file_stream)
) as keyp
on ft.path_locator=keyp.document_key
where keyp.keyphrase=N'效能'
order by keyp.score desc
Score越接近1,表示該關鍵詞組在文件中權重越高(詞組權重演算法可參考 Language model)。
使用 SEMANTICSIMILARITYTABLE : 依所指定的文件來找出相似文件。
declare @mydocid hierarchyid
select @mydocid=path_locator
from dbo.Mydocs
where name=N'善用parallel.doc'
select top(10) ft.name,ft.cached_file_size,keyp.score
from dbo.Mydocs as ft
inner join SEMANTICSIMILARITYTABLE
(
dbo.Mydocs,file_stream,@mydocid
) as keyp
on keyp.matched_document_key =ft.path_locator
order by keyp.score desc
Score越接近1,表示該該文件相似度越高。
使用 semanticsimilaritydetailstable: 兩個指定文件中顯示common Key phrase(共同的關鍵詞組)。
declare @mydocid1 hierarchyid
declare @mydocid2 hierarchyid
select @mydocid1=path_locator
from dbo.Mydocs
where name=N'善用parallel.doc'
select @mydocid2=path_locator
from dbo.Mydocs
where name=N'交易處理觀念與理論.ppt'
select top(10) keyp.keyphrase, keyp.score
from semanticsimilaritydetailstable
(
dbo.Mydocs,file_stream,@mydocid1,file_stream,@mydocid2
) as keyp
order by keyp.score desc