Detta är den andra delen av materialet tillägnad SQL Server Semantic Search . I den tidigare artikeln utforskade vi grunderna. Nu ska vi fokusera på att jämföra dokument lagrade i Windows filsystem och den jämförande analysen med den semantiska sökningen i SQL Server.
Utföra jämförande analys av namnbaserade dokument
Vi kommer att göra en jämförande analys av dokument baserat på deras standardnamn. Låt oss nu göra en snabb kontroll genom att fråga EmployeesFilestreamSample databas som vi satte upp tidigare:
-- View stored documents managed by File Table to check
SELECT stream_id
,[name]
,file_type
,creation_time
FROM EmployeesFilestreamSample.dbo.EmployeesDocumentStore
Resultaten måste visa oss lagrade dokument:
Semantisk sökchecklista
Vi har redan databasen och två exempel på MS Word-dokument på filsystem med hjälp av filtabell (du kan hänvisa till del 1 för att uppdatera kunskapen om det behövs). Men det gör det inte automatiskt kvalificera våra dokument för scenariot Semantisk sökning.
Semantisk sökning kan aktiveras på något av följande sätt:
- Om du redan har ställt in Fulltextsökning , kan du aktivera semantisk sökning i ett enda steg.
- Du kan ställa in den semantiska sökningen direkt, men innan du måste ställa in fulltextsökningen också.
Fulltextsökningstest innan den semantiska sökinställningen
Om en fulltextfråga fungerar behöver vi bara aktivera semantisk sökning. För att kontrollera det, kör en fulltextfråga mot önskad tabell:
-- Searching word Employee using Full-Text search against EmployeesDocumentStore File Table
SELECT [name]
FROM [EmployeesFilestreamSample].[dbo].[EmployeesDocumentStore]
WHERE CONTAINS(name,'Employee')
Utdata:
Därför måste vi först uppfylla kraven för fulltextsökning och sedan aktivera semantisk sökning.
Aktivera semantisk sökning för användning
Minst två av följande punkter är nödvändiga för att använda semantisk sökning:
- Unikt index
- En fulltextkatalog
- Ett fulltextindex
Kör följande T-SQL-skript för att skapa ett unikt index:
-- Create unique index required for Semantic Search
CREATE UNIQUE INDEX UQ_Stream_Id
ON EmployeesDocumentStore(stream_id)
GO
Skapa en fulltextkatalog baserad på det nyskapade unika indexet. Och skapa sedan ett fulltextindex som visas nedan:
-- Getting Semantic Search ready to be used with File Table
CREATE FULLTEXT CATALOG EmployeesFileTableCatalog WITH ACCENT_SENSITIVITY = ON;
CREATE FULLTEXT INDEX ON EmployeesDocumentStore
(
name LANGUAGE 1033 STATISTICAL_SEMANTICS,
file_type LANGUAGE 1033 STATISTICAL_SEMANTICS,
file_stream TYPE COLUMN file_type LANGUAGE 1033 STATISTICAL_SEMANTICS
)
KEY INDEX UQ_Stream_Id
ON EmployeesFileTableCatalog WITH CHANGE_TRACKING AUTO, STOPLIST=SYSTEM;
Resultaten:
Fulltextsökningstest efter installation av semantisk sökning
Låt oss köra samma fulltextfråga för att söka efter ordet Anställd i de lagrade dokumenten:
-- Searching (after Semantic Search setup) word Employee using Full-Text search against EmployeesDocumentStore File Table
SELECT [name]
FROM [EmployeesFilestreamSample].[dbo].[EmployeesDocumentStore]
WHERE CONTAINS(name,'Employee')
Utdata:
Det går bra för fulltextfrågor att arbeta mot filtabellen medan vi förbereder den för semantisk sökning.
Lägg till fler MS Word-dokument
Vi går till EmployeesDocumentStore File Table och klicka på Utforska FileTable Directory :
Skapa och lagra ett nytt dokument som heter Sadaf Contract Employee :
Lägg sedan till följande text i det nyskapade dokumentet. Den första raden måste vara titeln på dokumentet!
Sadaf kontraktsanställd (titel)
Sadaf är en mycket effektiv affärsanalytiker som gör kontaktbaserat arbete. Hon är fullt kapabel att hantera affärskrav och omvandla dem till tekniska specifikationer för utvecklarna att arbeta med. Hon är en mycket erfaren affärsanalytiker.
Lägg till ett annat dokument som heter Mike Permanent Employee :
Uppdatera dokumentet med följande text:
Mike Permanent Employee (Titel på dokumentet)
Mike är en ny programmerare vars expertis inkluderar webbutveckling. Han lär sig snabbt och arbetar gärna med alla projekt. Han har en stark problemlösningsförmåga men han har mindre affärskunskap. Han behöver hjälp från andra utvecklare eller affärsanalytiker för att förstå problemet och uppfylla kraven.
Han är bra när han arbetar med små projekt men han kämpar om han får ett stort eller komplext projekt.
Vi har fyra dokument lagrade i Windows filsystem som hanteras av File Table. Dessa dokument bör användas av semantisk sökning (inklusive fulltextsökning).
Viktigt:Även om vi just har lagrat fyra MS Word-dokument i mappen som ett exempel, kan du föreställa dig vikten av att använda semantisk sökning när hundratals sådana dokument underhålls av en SQL Server-databas och du behöver fråga efter dessa dokument för att hitta värdefull information.
Standardnamnet på dokument har stor betydelse för en framgångsrik implementering av detta tillvägagångssätt.
Enkel räkning av dokument
Vi kan jämföra dessa dokument och definiera skillnader och likheter baserat på deras standardnamn med hjälp av semantisk sökning. Till exempel kan en enkel fråga berätta för oss det totala antalet dokument som finns lagrade i Windows-mappen:
-- Getting total number of stored documents
SELECT COUNT(*) AS Total_Documents FROM EmployeesDocumentStore
Jämförelse av fasta och kontraktsbaserade anställda
Den här gången använder vi Semantic Search för att jämföra antalet fast anställda och kontraktsbaserade anställda i vår organisation:
-- Creating a summary table variable
DECLARE @Documents TABLE
(DocumentType VARCHAR(100),
DocumentsCount INT)
INSERT INTO @Documents -- Storing total number of stored documents into summary table
SELECT 'Total Documents',COUNT(*) AS Total_Documents FROM EmployeesDocumentStore
INSERT INTO @Documents -- Storing total number of permanent employees documents stored into summary table
SELECT 'Total Permanent Employees',COUNT(*)
FROM semantickeyphrasetable (EmployeesDocumentStore, *)
WHERE keyphrase = 'Permanent'
INSERT INTO @Documents --Storing total number of permanent employees documents stored
SELECT 'Total Contract Employees',COUNT(*)
FROM semantickeyphrasetable (EmployeesDocumentStore, *)
WHERE keyphrase = 'Contract'
SELECT DocumentType,DocumentsCount FROM @Documents
Utdata:
Låt oss köra en enkel (dokumentnamnbaserad) semantisk sökfråga för att se sökfrasen och dess relativa poäng för varje dokument:
-- Getting keyphrase and relative score for all the documents
SELECT * FROM semantickeyphrasetable(EmployeesDocumentStore, NAME)
ORDER BY score
Utdata:
Låt oss lägga till mer detaljer till dokumentnamnen. Vi byter namn på dem enligt följande:
- Asif Fast Anställd – Erfaren projektledare
- Mike Permanent Employee – Fresh Programmer
- Peter fast anställd – Fresh Project Manager
- Sadaf kontraktsanställd – erfaren affärsanalytiker
Hitta nya medarbetare (dokument)
Hitta dokumenten relaterade till nya anställda baserat på deras titlar (standardnamn):
-- Getting document name-based scoring to find fresh employees for a new project
SELECT (SELECT name from EmployeesDocumentStore where path_locator=document_key) as DocumentName
,keyphrase,score FROM semantickeyphrasetable(EmployeesDocumentStore, NAME) where keyphrase='fresh'
order by DocumentName desc
Resultaten:
Hitta erfarna medarbetare (dokument)
Anta att vi snabbt vill granska alla detaljer om erfarna medarbetare för det komplexa projektet som ligger framför oss. Använd följande semantiska sökfråga:
-- Getting document name-based scoring to find all experienced employees
SELECT (SELECT name from EmployeesDocumentStore where path_locator=document_key) as DocumentName ,keyphrase,score FROM semantickeyphrasetable(EmployeesDocumentStore, NAME)
where keyphrase='experienced' order by DocumentName
Utdata:
Hitta alla projektledare (dokument)
Slutligen, om vi snabbt vill gå igenom dokumenten för alla projektledare, behöver vi följande semantiska sökfråga:
-- Getting document name-based scoring to find all project managers
SELECT (SELECT name from EmployeesDocumentStore where path_locator=document_key) as DocumentName ,keyphrase,score FROM semantickeyphrasetable(EmployeesDocumentStore, NAME)
where keyphrase='Project'
Resultaten:
Efter att ha implementerat genomgången kan du framgångsrikt lagra ostrukturerad data, såsom MS Word-dokument, i en Windows-mapp med hjälp av File Table.
Namnbaserad analysgranskning
Hittills har vi lärt oss hur man utför en namnbaserad analys av dokument lagrade i en filtabell med hjälp av semantisk sökning. Vi behöver dock följande villkor uppfyllda:
- Standardnamn bör finnas på plats.
- Namn bör ge den information som krävs för analys.
Dessa villkor är också begränsningar för den namnbaserade analysen. Men detta betyder inte att vi inte kan göra mycket med det.
Vårt fokus ligger kvar på den namn-/kolumnbaserade semantiska sökmetoden.
Visa namnkolumnerna för dokumenten
Låt oss se några av huvudkolumnerna i dokumenttabellen inklusive namnet kolumn:
USE EmployeesFilestreamSample
-- View name column with the file types of the stored documents in File Table for analysis
SELECT name,file_type
FROM dbo.EmployeesDocumentStore
Utdata:
Förstå funktionen SEMANTICKEYPHRASETABLE
SQL Server erbjuder SEMANTICKEYPHRASETABLE funktion för att analysera dokumentet med semantisk sökning. Syntaxen är följande:
SEMANTICKEYPHRASETABLE
(
table,
{ column | (column_list) | * }
[ , source_key ]
)
Denna funktion ger oss nyckelfraser förknippade med dokumentet. Vi kan använda dem för att analysera dokument baserat på deras namn eller innehåll. I vårt fall behöver vi inte bara använda den här funktionen utan också förstå hur vi använder den på rätt sätt.
Funktionen kräver följande data:
- Namnet på filtabellen som ska användas för analys av semantisk sökning.
- Namnet på kolumnen som ska användas för analys av semantisk sökning.
Sedan returnerar den följande data:
- Column_id – kolumnnumret
- Document_Key – den primära standardnyckeln för filtabelldokumentet
- Sökfras – är en fras som Semantic Search bestämmer sig för att indexera för analys. Det gäller både namn och innehåll i dokumentet beroende på vilken kolumn vi vill se nyckelfraserna för
- Poäng – bestämmer styrkan hos en nyckelfras som är kopplad till ett dokument, till exempel hur ett dokument bäst känns igen av dess nyckelfras. Poängen kan vara mellan 0,0 och 1,0.
Analysera alla dokument med SEMANTICKEYPHRASETABLE-funktionen
Vi använder SEMANTICKEYPHRASETABLE funktion för den namnbaserade analysen av dokumenten lagrade i Windows-mappen som hanteras av filtabellen.
Kör följande T-SQL-skript:
USE EmployeesFilestreamSample
-- View key phrases and their score for the name column
SELECT * FROM SEMANTICKEYPHRASETABLE(EmployeesDocumentStore,name)
order by score desc
Utdata:
Vi har en lista över alla nyckelfraser bifogade till alla dokument och deras poäng. column_id 3 på den översta raden är namnet kolumn. Dessutom kallade vi också funktionen genom att ange denna kolumn (namn):
Du kan hitta dokumentnyckeln : 0xFD89E1811D4F3B2FEB1012DF0C8016F9ACEB2F3260 kör följande skript (även om det är tydligt att det här dokumentet är det där namnet innehåller nyckelfrasen sadaf ):
USE EmployeesFilestreamSample
-- Finding document name by its key (path_locator)
SELECT name,path_locator FROM dbo.EmployeesDocumentStore
WHERE path_locator=0xFD89E1811D4F3B2FEB1012DF0C8016F9ACEB2F3260
Utdata:
nyckelfrasen sadaf har fått bästa poäng :1.0 .
Således, i fallet med standarddokumentnamn med tillräcklig information för analysen av semantisk sökning, vår nyckelfras sadaf är den bästa matchningen för det specifika dokumentnamnet.
Analysera specifika dokument med SEMANTICKEYPHRASETABLE-funktionen
Vi kan begränsa vår semantiska sökningsanalys baserat på namnet kolumn. Till exempel behöver vi bara se namnkolumnen- baserade nyckelfraser i ett visst dokument. Vi kan ange dokumentnyckeln i SEMANTICKEYPHRASETABLE Funktion.
Först identifierar vi dokumentnyckeln för det dokumentet där vi vill se alla nyckelfraser. Kör följande T-SQL-skript:
-- Find document_key of the document where the name contains Peter
SELECT name,path_locator as document_key From EmployeesDocumentStore
WHERE name like '%Peter%'
Dokumentnyckeln är 0xFF6A92952500812FF013376870181CFA6D7C070220
Låt oss nu titta på detta dokument om alla nyckelfraser som kan definiera dokumentnamnet:
-- View all the key phrases and their score for a document related to Peter permanent employee
SELECT column_id,name,keyphrase,score FROM SEMANTICKEYPHRASETABLE(EmployeesDocumentStore,name,0xFF6A92952500812FF013376870181CFA6D7C070220)
INNER JOIN dbo.EmployeesDocumentStore on path_locator=document_key
order by score desc
Resultaten:
Nyckelfrasen anställd får det högsta betyget i detta dokument. Vi kan se att alla ord i kolumnen är nyckelfraser som bestämmer dokumentets betydelse.
Förstå funktionen SEMANTICSIMILARITYTABLE
Den här funktionen hjälper oss att jämföra ett dokument med alla andra dokument baserat på nyckelfraser. Syntaxen för denna funktion är som följer:
SEMANTICSIMILARITYTABLE
(
table,
{ column | (column_list) | * },
source_key
)
Det kräver namnet på tabellen, kolumnen och dokumentnyckeln för att matcha andra dokument. Vi kan till exempel konstatera att två dokument är lika om de har ett bra resultat för sökfrasmatchning.
Jämföra dokument med funktionen SEMANTICSIMILARITYTABLE
Låt oss jämföra ett dokument med andra dokument med SEMANTICSIMILARITYTABLE Funktion.
Jämföra alla projektledares dokument
Vi behöver se alla dokument relaterade till projektledare. Från exemplen ovan vet vi att dokumentnyckeln för det angivna dokumentet är 0xFF6A92952500812FF013376870181CFA6D7C070220 . Därför kan vi använda den här nyckeln för att hitta andra matchningar inklusive projektledare:
USE EmployeesFilestreamSample
-- View all the documents closely related to Peter project manager
SELECT SST.source_column_id,SST.matched_column_id,EDS.name,SCORE FROM SEMANTICSIMILARITYTABLE(EmployeesDocumentStore,name,0xFF6A92952500812FF013376870181CFA6D7C070220) SST
INNER JOIN dbo.EmployeesDocumentStore EDS on EDS.path_locator=SST.matched_document_key
order by score desc
Utdata:
Det närmast relaterade dokumentet är Asif Fast anställd – Erfaren projektledare.docx . Det är vettigt eftersom båda anställda är fast anställda, och båda är projektledare.
Jämföra erfarna affärsanalytikers dokument
Nu ska vi jämföra dokumenten relaterade till erfaren affärsanalytiker s och hitta den närmaste matchningen med Semantisk sökning. Vi är begränsade till den dokumentnamnbaserade analysen:
USE EmployeesFilestreamSample
-- Finding document_key for experienced business analyst
select name,path_locator as document_key from EmployeesDocumentStore
where name like '%experienced business analyst%'
-- View all the documents closely related to experienced business analyst
SELECT SST.source_column_id,SST.matched_column_id,EDS.name,SCORE FROM SEMANTICSIMILARITYTABLE(EmployeesDocumentStore,name,0xFD89E1811D4F3B2FEB1012DF0C8016F9ACEB2F3260) SST
INNER JOIN dbo.EmployeesDocumentStore EDS on EDS.path_locator=SST.matched_document_key
order by score desc
Utdata:
Som vi kan se från resultaten ovan är den närmaste matchningen för dokumentet relaterat till den erfarna affärsanalytikern är dokumentet för den erfarne projektledaren eftersom de båda är erfarna . Trots det indikerar poängen 0,3 att det inte finns mycket gemensamt mellan dessa två dokument.
Slutsats
Grattis! Vi har framgångsrikt lärt oss hur man lagrar dokument i Windows-mappar och analyserar dem med hjälp av semantisk sökning. Vi undersökte också vilka funktioner som kan användas i praktiken. Nu kan du tillämpa den nya kunskapen och prova följande övningar på
Håll utkik efter ytterligare material!