Това е втората част от материала, посветен на SQL Server Semantic Search . В предишната статия разгледахме основите. Сега ще се съсредоточим върху сравняването на документи, съхранявани във файловата система на Windows, и сравнителния анализ със семантичното търсене в SQL Server.
Извършване на сравнителен анализ на документи, базирани на имена
Ще направим сравнителен анализ на документите въз основа на тяхното стандартно именуване. В този момент нека направим бърза проверка, като потърсим EmployeesFilestreamSample база данни, която настроихме по-рано:
-- View stored documents managed by File Table to check
SELECT stream_id
,[name]
,file_type
,creation_time
FROM EmployeesFilestreamSample.dbo.EmployeesDocumentStore
Резултатите трябва да ни покажат съхранени документи:
Контролен списък за семантично търсене
Вече разполагаме с базата данни и два примерни документа на MS Word във файловата система, използвайки таблица с файлове (може да се обърнете към част 1, за да опресните знанията, ако е необходимо). Това обачене автоматично квалифицираме нашите документи за сценария за семантично търсене.
Семантичното търсене може да бъде активирано по един от следните начини:
- Ако вече сте настроили Пълнотекстово търсене , можете да активирате семантично търсене с една стъпка.
- Можете да настроите семантичното търсене директно, но преди да трябва да настроите и пълнотекстово търсене.
Тест за пълнотекстово търсене преди настройката за семантично търсене
Ако заявка с пълен текст работи, трябва само да активираме семантично търсене. За да проверите това, изпълнете заявка за пълен текст към желаната таблица:
-- Searching word Employee using Full-Text search against EmployeesDocumentStore File Table
SELECT [name]
FROM [EmployeesFilestreamSample].[dbo].[EmployeesDocumentStore]
WHERE CONTAINS(name,'Employee')
Резултатът:
Следователно, първо трябва да изпълним изискванията за пълнотекстово търсене и след това да активираме семантично търсене.
Разрешаване на семантично търсене за използване
За използване на семантично търсене са необходими поне две от следните точки:
- Уникален индекс
- Пълнотекстов каталог
- Пълнотекстов индекс
Изпълнете следния T-SQL скрипт, за да създадете уникален индекс:
-- Create unique index required for Semantic Search
CREATE UNIQUE INDEX UQ_Stream_Id
ON EmployeesDocumentStore(stream_id)
GO
Създайте каталог с пълен текст въз основа на новосъздадения уникален индекс. След това създайте индекс с пълен текст, както е показано по-долу:
-- 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;
Резултатите:
Тест за пълнотекстово търсене след настройка на семантично търсене
Нека изпълним същата пълнотекстова заявка, за да търсим думата Служител в съхранените документи:
-- 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')
Резултатът:
Добре е пълнотекстовите заявки да работят срещу таблицата с файлове, докато я подготвяме за семантично търсене.
Добавяне на още MS Word документи
Отиваме в EmployeesDocumentStore Файлова таблица и щракнете върху Изследване на директория на FileTable :
Създайте и съхранете нов документ, наречен Sadaf Contract Employee :
След това добавете следния текст към новосъздадения документ. Първият ред трябва да е заглавието на документа!
Договорен служител в Sadaf (заглавие)
Садаф е много ефективен бизнес анализатор, който извършва работа, базирана на контакти. Тя е напълно способна да се справи с бизнес изискванията и да ги превърне в технически спецификации, върху които разработчиците да работят. Тя е много опитен бизнес анализатор.
Добавете друг документ, наречен Постоянен служител на Майк :
Актуализирайте документа със следния текст:
Майк постоянен служител (Заглавие на документа)
Майк е нов програмист, чийто опит включва уеб разработка. Той се учи бързо и с удоволствие работи по всеки проект. Той има силни умения за решаване на проблеми, но има по-малко бизнес познания. Той се нуждае от помощ от други разработчици или бизнес анализатори, за да разбере проблема и да отговори на изискванията.
Той е добър, когато работи по малки проекти, но се затруднява, ако му бъде даден голям или сложен проект.
Имаме четири документа, съхранявани във файловата система на Windows, управлявана от File Table. Тези документи трябва да се използват от семантично търсене (включително пълнотекстово търсене).
Важно:Въпреки че току-що съхранихме четири MS Word документа в папката като извадка, можете да си представите колко е важно да използвате семантично търсене, когато стотици такива документи се поддържат от база данни на SQL Server и трябва да направите заявка за тези документи за намиране на ценна информация.
Стандартното именуване на документите има голямо значение за успешното прилагане на този подход.
Просто броене на документи
Можем да сравним тези документи и да дефинираме разликите и приликите въз основа на тяхното стандартно именуване, използвайки семантично търсене. Например, една проста заявка може да ни каже общия брой документи, съхранявани в папката на Windows:
-- Getting total number of stored documents
SELECT COUNT(*) AS Total_Documents FROM EmployeesDocumentStore
Сравнение на постоянни спрямо наети по договор служители
Този път използваме семантично търсене, за да сравним броя на постоянните и договорно базирани служители в нашата организация:
-- 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
Резултатът:
Нека изпълним проста (базирана на име на документ) заявка за семантично търсене, за да видим ключовата фраза и неговиятотносителен резултат за всеки документ:
-- Getting keyphrase and relative score for all the documents
SELECT * FROM semantickeyphrasetable(EmployeesDocumentStore, NAME)
ORDER BY score
Резултатът:
Нека добавим повече подробности към имената на документите. Ще ги преименуваме, както следва:
- Постоянен служител на Asif – опитен ръководител на проекти
- Майк постоянен служител – нов програмист
- Peter постоянен служител – Fresh Project Manager
- Договорен служител в Sadaf – опитен бизнес анализатор
Намиране на нови служители (документи)
Намерете документите, свързани с нови служители, въз основа на техните длъжности (стандартно именуване):
-- 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
Резултатите:
Намиране на опитни служители (документи)
Да предположим, че искаме бързо да прегледаме всички подробности за опитни служители за предстоящия комплексен проект. Използвайте следната заявка за семантично търсене:
-- 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
Резултатът:
Намиране на всички ръководители на проекти (документи)
И накрая, ако искаме бързо да преминем през документите за всички ръководители на проекти, се нуждаем от следната заявка за семантично търсене:
-- 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'
Резултатите:
След като приложите инструкциите, можете успешно да съхранявате неструктурирани данни, като документи на MS Word, в папка на Windows, като използвате таблица с файлове.
Преглед на анализ, базиран на имена
Досега се научихме как да извършваме базиран на имена анализ на документи, съхранявани във файлова таблица, използвайки семантично търсене. Трябва обаче да са изпълнени следните условия:
- Стандартното именуване трябва да е на място.
- Имената трябва да предоставят информацията, необходима за анализ.
Тези условия също са ограничения на анализа, базиран на имена. Но това не означава, че не можем да направим много с него.
Нашият фокус остава върху подхода за семантично търсене, базиран на име/колона.
Преглед на колоните с имена на документите
Нека разгледаме някои от основните колони на таблицата с документи, включително Име колона:
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
Резултатът:
Разбиране на функцията SEMANTICKEYPHRASETABLE
SQL Server предлага SEMANTICKEYPHRASETABLE функция за анализ на документа със семантично търсене. Синтаксисът е следният:
SEMANTICKEYPHRASETABLE
(
table,
{ column | (column_list) | * }
[ , source_key ]
)
Тази функция ни дава ключови фрази, свързани с документа. Можем да ги използваме, за да анализираме документи въз основа на техните имена или съдържание. В нашия случай трябва не само да използваме тази функция, но и да разберем как да я използваме правилно.
Функцията изисква следните данни:
- Име на таблицата с файлове, която да се използва за анализ на семантично търсене.
- Име на колоната, която ще се използва за анализ на семантично търсене.
След това връща следните данни:
- Идентификатор_на_колона – номера на колоната
- Ключ_документ – първичният ключ по подразбиране за документа File Table
- Ключова фраза – е фраза, която Semantic Search решава да индексира за анализ. Прилага се както за името, така и за съдържанието на документа в зависимост от това за коя колона искаме да видим ключовите фрази.
- Резултат – определя силата на ключова фраза, свързана с документ, като например как документът се разпознава най-добре по неговата ключова фраза. Резултатът може да бъде между 0,0 и 1,0.
Анализиране на всички документи с помощта на функцията SEMANTICKEYPHRASETABLE
Използваме SEMANTICKEYPHRASETABLE функция за базиран на имена анализ на документите, съхранявани в папката на Windows, управлявана от таблицата с файлове.
Изпълнете следния T-SQL скрипт:
USE EmployeesFilestreamSample
-- View key phrases and their score for the name column
SELECT * FROM SEMANTICKEYPHRASETABLE(EmployeesDocumentStore,name)
order by score desc
Резултатът:
Имаме списък с всички ключови фрази, приложени към всички документи и техните резултати. идентификатор на_колона 3 в горния ред е името колона. Освен това, ние също извикахме функцията, като предоставихме тази колона (име):
Можете да намерите document_key : 0xFD89E1811D4F3B2FEB1012DF0C8016F9ACEB2F3260, изпълняващ следния скрипт (въпреки че е ясно, че този документ е този, в който името съдържа ключовата фраза sadaf ):
USE EmployeesFilestreamSample
-- Finding document name by its key (path_locator)
SELECT name,path_locator FROM dbo.EmployeesDocumentStore
WHERE path_locator=0xFD89E1811D4F3B2FEB1012DF0C8016F9ACEB2F3260
Резултатът:
Ключовата фраза садаф получи най-добра оценка :1.0 .
По този начин, в случай на стандартно именуване на документ с достатъчно информация за анализа на семантично търсене, нашата ключова фраза sadaf е най-доброто съвпадение за това конкретно име на документ.
Анализиране на конкретен документ с помощта на функцията SEMANTICKEYPHRASETABLE
Можем да стесним нашия анализ на семантично търсене въз основа на име колона. Например, трябва само да видим колоната с име- базирани ключови фрази на конкретен документ. Можем да посочим ключа на документа в SEMANTICKEYPHRASETABLE Функция.
Първо, ние идентифицираме ключа на документа за този документ, където искаме да видим всички ключови фрази. Изпълнете следния T-SQL скрипт:
-- Find document_key of the document where the name contains Peter
SELECT name,path_locator as document_key From EmployeesDocumentStore
WHERE name like '%Peter%'
Ключът на документа е 0xFF6A92952500812FF013376870181CFA6D7C070220
Сега нека разгледаме този документ относно всички ключови фрази, които могат да дефинират името на документа:
-- 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
Резултатите:
Ключовата фраза служител получава най-висок резултат в този документ. Можем да видим, че всички думи в колоната са ключови фрази, които определят значението на документа.
Разбиране на функцията SEMANTICSIMILARITYTABLE
Тази функция ни помага да сравним един документ с всички други документи въз основа на ключови фрази. Синтаксисът на тази функция е както следва:
SEMANTICSIMILARITYTABLE
(
table,
{ column | (column_list) | * },
source_key
)
Той изисква името на таблицата, колоната и ключа на документа, за да съответстват на други документи. Например, можем да заявим, че два документа са сходни, ако имат добър резултат за съвпадение на ключовите фрази.
Сравняване на документи с помощта на функцията SEMANTICSIMILARITYTABLE
Нека сравним документ с други документи, като използваме ТАБЛИЦАТА НА СЕМАНТИЧНОСОБСТВЕНОСТ Функция.
Сравняване на всички документи на ръководителите на проекти
Трябва да видим всички документи, свързани с ръководителите на проекти. От горните примери знаем, че ключът за документ за посочения документ е 0xFF6A92952500812FF013376870181CFA6D7C070220 . Следователно можем да използваме този ключ, за да намерим други съвпадения, включително мениджъри на проекти:
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
Резултатът:
Най-тясно свързаният документ е Постоянен служител на Asif – опитен мениджър на проекти.docx . Има смисъл, тъй като и двамата служители са постоянни работници и двамата са ръководители на проекти.
Сравняване на документите на опитен бизнес анализатор
Сега ще сравним документите, свързани с опитен бизнес анализатор s и намерете най-близкото съвпадение с помощта на семантично търсене. Ние сме ограничени до анализа на базата на име на документа:
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
Резултатът:
Както можем да видим от резултатите по-горе, най-близкото съвпадение за документа е свързано с опитния бизнес анализатор е документът на опитния ръководител на проекти защото и двамата са си опити . Въпреки това оценката от 0,3 показва, че няма много общо между тези два документа.
Заключение
Честито! Успешно се научихме как да съхраняваме документи в папки на Windows и да ги анализираме, използвайки семантично търсене. Проучихме и функциите, които да използваме на практика. Сега можете да приложите новите знания и да опитате следните упражнения за
Очаквайте нови материали!