Nachdem ich im letzten Artikel über allgemeine Neuerungen in der Volltextsuche von SQL Server „Denali“ gesprochen habe geht es dieses Mal um ein komplett neues Feature in der Volltextsuche: Statistische Semantische Suche. Das Wort „semantisch“ hat in der IT viele Bedeutungen, hier heißt es: Die Volltextsuche erkennt statistisch relevante Schlüssel-Phrasen in Dokumenten und kann diese Erkenntnis für die Extraktion dieser Schlüssel-Phrasen und für die Analyse der Ähnlichkeit von Dokumenten verwenden. Typische Fragestellungen für die semantische Suche sind: „Was sind wichtige Phrasen in diesem Dokument?“ oder „Welche Dokumente ähneln diesem Dokument und warum?
Die semantische Suche ist eine Erweiterung der Volltextsuche, die extra für volltextindizierte Spalten aktiviert wird. Das geht in T-SQL (durch Angabe einer Sprach-ID und des Schlüsselworts Statistical_Semantics an der volltextindizierten Spalte) oder in der grafischen Volltextindex-Oberfläche:
Damit das klappt muss allerdings zuerst die semantische Suche konfiguriert werden. Dazu wird zuerst die semantische Sprachstatistik-Datenbank installiert, indem man das Paket SemanticLanguageDatabase.msi vom Installationsmedium entpackt und die entpackte Datenbank an den Server anhängt. Danach muss die Datenbank noch mittels sp_fulltext_semantic_register_language_statistics_db registriert werden. Wie das geht findet sich hier.
Die unterstützten Sprachen kann man dann mit
select * from sys.fulltext_semantic_languages
herausfinden. Deutsch ist dabei. Die eigentlichen semantischen Daten in dieser Datenbank sind übrigens als Internal Tables abgelegt und somit nicht direkt für ein SELECT zugänglich.
Danach kann man wie oben angegeben den Volltextindex mit semantischer Suche erstellen. Ich habe das auf der Filetable gemacht, deren Erstellung ich in diesem Artikel beschrieben habe. Es muss aber keine Filetable sein, jede volltextindizierte Spalte einer Tabelle funktioniert. Zu beachten ist, dass die semantische Suche einen Volltextindex deutlich vergrößert und auch die Erstellungszeit erhöht. Daher sollte man semantische Suche nur aktivieren, wenn man sie auch wirklich verwenden will. Außerdem muss natürlich die Volltextindizierung für die in der Tabelle vorhandenen Dokumenttypen vorbereitet sein: Die entsprechenden IFilter müssen installiert sein, deren Verwendung aktiviert usw.
Schlüsselwörter finden
Nun kann man zum Beispiel für ein Dokument herausfinden, was die statistisch wichtigen Schlüsselwörter in diesem Dokument sind. Das geht über die Funktion SEMANTICKEYPHRASETABLE:
DECLARE @DocID hierarchyid SELECT @DocID = path_locator from MeineFiletable where name = 'ADS.pptx'; --Key Phrases SELECT TOP(10) KEYP_TBL.keyphrase FROM SEMANTICKEYPHRASETABLE ( MeineFiletable, file_stream, @DocID ) AS KEYP_TBL ORDER BY KEYP_TBL.score DESC;
DECLARE @DocID hierarchyid
SELECT @DocID = path_locator from MeineFiletable where name = 'ADS.pptx';
--Key Phrases
SELECT TOP(10) KEYP_TBL.keyphrase
FROM SEMANTICKEYPHRASETABLE
( MeineFiletable,
file_stream,
@DocID
) AS KEYP_TBL
ORDER BY KEYP_TBL.score DESC;
keyphrase sql azure verwaltung technet durch datacenter tds isv unternehmen arten
keyphrase
sql
azure
verwaltung
technet
durch
datacenter
tds
isv
unternehmen
arten
Offensichtlich habe ich hier also über SQL Azure gesprochen.
Anders herum kann man auch herausfinden, in welchen Dokumenten es um Azure geht indem man die Dokumente nach Signifikanz der Phrase „Azure“ sortieren lässt:
SELECT TOP (5) DOC_TBL.path_locator.ToString() Locator, DOC_TBL.name FROM MeineFiletable AS DOC_TBL INNER JOIN SEMANTICKEYPHRASETABLE ( MeineFiletable, file_stream ) AS KEYP_TBL ON DOC_TBL.path_locator = KEYP_TBL.document_key WHERE KEYP_TBL.keyphrase = 'azure' ORDER BY KEYP_TBL.Score DESC;
SELECT TOP (5) DOC_TBL.path_locator.ToString() Locator, DOC_TBL.name
FROM MeineFiletable AS DOC_TBL
INNER JOIN SEMANTICKEYPHRASETABLE
file_stream
ON DOC_TBL.path_locator = KEYP_TBL.document_key
WHERE KEYP_TBL.keyphrase = 'azure'
ORDER BY KEYP_TBL.Score DESC;
Locator name /163317661833190.115726554008670.1866003634/ 218988078402337.61914970700195.3199820884/ DatabaseProAzureReporting.docx /235419278667080.230118955961229.3763918334/ 95176762753143.43209610854162.380882874/ Webcast SQL Azure und die Microsoft Cloud Plattform.pptx /235419278667080.230118955961229.3763918334/ 195400071903089.254316101152370.2453146947/ Webcast SQL Azure Überblick.pptx /235419278667080.230118955961229.3763918334/ 204734086686021.60759175188448.1218421407/ SQL Azure und die Microsoft Cloud Plattform.pptx /163317661833190.115726554008670.1866003634/ 148065100657714.221322731028740.4247534163/ SQL Azure CeBIT.pptx
Locator
name
/163317661833190.115726554008670.1866003634/ 218988078402337.61914970700195.3199820884/
DatabaseProAzureReporting.docx
/235419278667080.230118955961229.3763918334/ 95176762753143.43209610854162.380882874/
Webcast SQL Azure und die Microsoft Cloud Plattform.pptx
/235419278667080.230118955961229.3763918334/ 195400071903089.254316101152370.2453146947/
Webcast SQL Azure Überblick.pptx
/235419278667080.230118955961229.3763918334/ 204734086686021.60759175188448.1218421407/
SQL Azure und die Microsoft Cloud Plattform.pptx
/163317661833190.115726554008670.1866003634/ 148065100657714.221322731028740.4247534163/
SQL Azure CeBIT.pptx
Ähnliche Dokumente finden
Der andere Anwendungsfall für die statistische semantische Suche ist es, ähnliche Dokumente zu finden. Das geht über die Funktion SEMANTICSIMILARITYTABLE. Details zur Ähnlichkeit erhält man über SEMANTICSIMILARITYDETAILSTABLE. Eine einfache Abfrage “Welche Dokumente sind diesem ähnlich“ funktioniert so:
SELECT mft.name, sst.score FROM SEMANTICSIMILARITYTABLE ( MeineFiletable, file_stream, @DocID ) AS sst INNER JOIN MeineFiletable mft ON path_locator = matched_document_key ORDER BY score DESC
SELECT mft.name, sst.score
FROM SEMANTICSIMILARITYTABLE
) AS sst
INNER JOIN MeineFiletable mft
ON path_locator = matched_document_key
ORDER BY score DESC
Name Score Webcast SQL Azure Überblick.pptx 0,6667337 SQL Azure CeBIT.pptx 0,6150579 sqldays 2010 SQL Server 2008 R2 NonBI.pptx 0,3872314 SQL Server 2005 - Webcast - 2005-09-28 - Schutz sensitiver Daten.ppt 0,3602501 Was ist SQL Server Express 2008 R2.pptx 0,3286014
Name
Score
0,6667337
0,6150579
sqldays 2010 SQL Server 2008 R2 NonBI.pptx
0,3872314
SQL Server 2005 - Webcast - 2005-09-28 - Schutz sensitiver Daten.ppt
0,3602501
Was ist SQL Server Express 2008 R2.pptx
0,3286014
Will man dann den Grund für die Ähnlichkeit finden so joint man über SEMANTICSIMILARITYDETAILSTABLE:
DECLARE @DocIDMatch hierarchyid SELECT @DocIDMatch = path_locator FROM MeineFiletable WHERE name = 'SQL Server 2005 - Webcast - 2005-09-28 - Schutz sensitiver Daten.ppt'; SELECT TOP(20) V4.keyphrase, V4.score FROM SEMANTICSIMILARITYDETAILSTABLE ( MeineFiletable, file_stream, @DocID, file_stream, @DocIDMatch ) AS V4 ORDER BY V4.score DESC;
DECLARE @DocIDMatch hierarchyid
SELECT @DocIDMatch = path_locator
FROM MeineFiletable
WHERE name = 'SQL Server 2005 - Webcast - 2005-09-28 - Schutz sensitiver Daten.ppt';
SELECT TOP(20) V4.keyphrase, V4.score
FROM SEMANTICSIMILARITYDETAILSTABLE
@DocID,
@DocIDMatch
) AS V4
ORDER BY V4.score DESC;
keyphrase score sql 0,6196678 technet 0,4326765 server 0,3456945 verschlüsselung 0,3421064 durch 0,3254796 schlüssel 0,3249941 wird 0,2818047 datum 0,2744119 zertifikat 0,2636287 public 0,2460675 arten 0,2402729 kosten 0,2268401 master 0,2166911 passwort 0,2148199 zum 0,2144909 microsoft 0,2132909 authentifizierung 0,2127908 symmetrisch 0,21237 immer 0,2091359 gmbh 0,2083207
score
0,6196678
0,4326765
server
0,3456945
verschlüsselung
0,3421064
0,3254796
schlüssel
0,3249941
wird
0,2818047
datum
0,2744119
zertifikat
0,2636287
public
0,2460675
0,2402729
kosten
0,2268401
master
0,2166911
passwort
0,2148199
zum
0,2144909
microsoft
0,2132909
authentifizierung
0,2127908
symmetrisch
0,21237
immer
0,2091359
gmbh
0,2083207
Offensichtlich geht es also in beiden Präsentationen um mein Lieblingsthema Verschlüsselung…
In Summe kann die neue semantische Suche in SQL Server „Denali“ sehr umfassend beim Verständnis von Dokumentbeständen und der inhaltlichen Suche darin helfen und so die meisten dokumentorientierten Datenbankanwendungen deutlich aufwerten.
Die Dokumentation zur semantischen Suche findet sich hier, der Download der Denali CTP3 hier
Gruß, Steffen