Създаването и управлението на стоп-списъци служи като един от основните компоненти, отговорни за подобряване на производителността на пълнотекстово търсене, наред с намаляването на размера на индекса. Тази статия има за цел да ви помогне да овладеете работата в дълбочина и да приложите множество стратегии за създаване на стоп-списъци с прости, но интересни примери.
Ще подчертаем също важността на различните методи за генериране на стоп-списъци и ще изясним как да изберем най-подходящия метод.
Защо овладяване на стоп-списъци
Когато говорим за използване на стоп-списъци по отношение на пълнотекстово търсене, първият въпрос е защо научаваме толкова много за тези списъци за спиране. Отговорът се крие както в очевидните, така и в скритите предимства от използването на стоп-списъци с пълнотекстово търсене. Има и дългосрочни печалби, които могат да донесат, след като бъдат внедрени успешно.
Значение на списъците за спиране
Списъкът за спиране е специфичен за езика компонент на пълнотекстово търсене, съдържащ дефинирани от потребителя или предоставени от системата стоп думи. Трябва да изключи такива думи да станат част от пълнотекстово търсене.
Дизайнът за пълнотекстово търсене без списък със спирания не е оптималното използване на специфични за езика компоненти, които трябва да подобрят ефективността на пълнотекстово търсене и времето за реакция.
Предварителни условия
- Можете да пишете и изпълнявате T-SQL скриптове.
- Пълнотекстово търсене трябва да бъде инсталирано във вашия екземпляр на SQL Server.
- Запознати сте с основните концепции и реализация на пълнотекстово търсене.
- Имате основни познания за спирателните думи и стоп-списъците.
В случай, че ви липсва информацията, за да гарантирате горните изисквания, вижте следните статии:
- Внедряване на пълнотекстово търсене в SQL Server 2016 за начинаещи
- Внедряване на пълнотекстово търсене в SQL Server 2016 за напреднали потребители
- Как да използвате Stopwords и Stoplist за подобряване на пълнотекстово търсене на SQL Server (FTS)
Множество стратегии за създаване на Stoplist
Има много различни методи или стратегии, но някои от тях са много по-добри от други. Всеки разработчик на база данни с умения за внедряване на пълнотекстово търсене трябва да е запознат с всички методи, за да избере най-добрия, когато е необходимо.
Най-ефективният начин да разберете тези различни стратегии е да ги приложите към примерна база данни.
Настройте примерна база данни
Първата стъпка е да настроите базата данни за изпълнение на пълнотекстови заявки. Създайте примерна база данни, наречена WatchReviewsMasterStoplist :
-- Create WatchReviewsMasterStoplist database
CREATE DATABASE WatchReviewsMasterStoplist;
GO
-- Connect to the sample database
USE WatchReviewsMasterStoplist
-- (2) Create WatchReview table
CREATE TABLE [dbo].[WatchReview]
(
[ReviewId] INT NOT NULL IDENTITY ,
[Date] DATETIME2 NULL,
[Person] VARCHAR(50) NULL,
[Details] VARCHAR(1000) NULL,
CONSTRAINT [PK_WatchReview] PRIMARY KEY (ReviewId)
)
-- (3) Populate WatchReview table
SET IDENTITY_INSERT [dbo].[WatchReview] ON
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (1, N'2020-06-01 00:00:00', N'Asif', N'Hi, I have just bought this Casio black digital watch which is excellent and has date, alarm, stopwatch and timer as well.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (2, N'2020-07-02 00:00:00', N'Asim', N'Hi, I have just bought this Casio black analog watch which is average and slightly discomforting and just got date and time.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (3, N'2020-08-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like an alarm, stopwatch, date, and timer. ')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-09-10 00:00:00', N'Brian ', N'Hi, I have just ordered this Seiko black digital watch which is excellent and has date, alarm and timer.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (5, N'2020-10-11 00:00:00', N'Peter', N'Hi, I have just ordered this Seiko white analog watch which is average and has alarm, date and timer.')
SET IDENTITY_INSERT [dbo].[WatchReview] OFF
Преглед на стратегиите за множество стоп-списъци
Можете да използвате следните три начина/стратегии, за да създадете списък за спиране и да предотвратите появата на шумни думи да станат част от вашите заявки за пълнотекстово търсене:
- Създайте персонализиран списък за спиране
- Създайте системен списък за спиране
- Създайте списък за спиране от персонализиран (или системен) списък за спиране
Необходими условия за списък за спиране
Не забравяйте, че преди да създадете списък за спиране, трябва да направите следното:
- Създайте уникален индекс на една от колоните на таблицата, ако няма налична ключова колона (първичен ключ).
- Създайте пълнотекстов каталог.
- Създайте индекс с пълен текст.
Създайте персонализиран списък за спиране
Да приемем, че е наличен уникален индекс или колона с първичен ключ (както в нашата примерна база данни). Създаваме персонализиран списък за спиране, както следва:
- Създайте пълнотекстов каталог.
- Създайте празен персонализиран списък за спиране.
- Създайте индекс с пълен текст с персонализирания списък за спиране, създаден в стъпка 2.
За подробна информация вижте статията Как да използвате Stopwords и Stoplist за подобряване на пълнотекстово търсене на SQL Server (FTS)
Плюсите и минусите на персонализираните стоп-списъци
Най-голямото предимство на създаването на персонализиран списък за спиране е, че можете да имате пълен контрол над него и да го следите, като добавяте и премахвате думи, които смятате за шумови думи.
Има обаче недостатък при използването на този подход. Списъкът за спиране е много ограничен и няма да включва препоръчаните от системата спирателни думи за допълнително подобряване на производителността на заявките за пълен текст.
Създаване на системен списък за спиране
Създайте системен стоп-лист (ако е предоставена колоната с първичен ключ или уникален индекс), както следва:
- Създайте пълнотекстов каталог.
- Създайте пълнотекстов индекс със системния списък за спиране.
Подготвяме се да използваме системния списък за спиране, като първо създадем пълнотекстов каталог:
-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO
Създайте индекс с пълен текст в колоната за рецензии (подробности) на таблицата WatchReview със системния стоп-лист. Използвайте следния T-SQL скрипт:
-- Create Full-Text index with System Stoplist
CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English])
KEY INDEX PK_WatchReview
WITH STOPLIST = System;
GO
Вижте списъка със спирания на системата за английски език
Можете да видите списъка със стоп думи, включени в системния стоп-списък на британския английски. Изпълнете следната SQL заявка:
-- View system stoplist of English language
SELECT name,stopword FROM sys.fulltext_system_stopwords sw
INNER JOIN sys.fulltext_languages fl
on sw.language_id=fl.lcid
where name='British English'
Резултатът е както следва:
Вижте топ 3 най-скорошни рецензии
Изпълнете бърза проверка на новосъздадената примерна база данни. Направете го, като вземете 3-те най-нови отзиви за часовници от WatchReview таблица:
-- Top 3 most recent watch reviews
SELECT TOP 3 wr.Person,FORMAT(wr.Date,'dd-MMM-yyyy') as ReviewDate,wr.Details FROM dbo.WatchReview wr
ORDER BY wr.Date DESC
Резултатът е както следва:
Проверка на спирателни думи чрез изпълнение на пълнотекстови заявки
Можем да изпълняваме пълнотекстови заявки към номинираната таблица. Не се учудвайте, ако много шумови думи (включени в списъка за спиране на системата за подобряване на производителността) не се покажат в заявките за пълен текст. Това означава, че нашият системен стоп-лист върши работата си правилно.
Както виждаме, думата „това“ присъства в топ 3 рецензии. Това обаче е шумна дума, разпозната от системния списък за спиране.
Нека проверим дали търсенето в пълен текст връща шумната дума„това“ включени в системния списък за спиране:
--Run Full-Text query to Search for Noise word 'this'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')
Резултатът е по-долу:
Сега можем да изпълним заявката за пълен текст, за да търсим думата „е“ което е друга шумна дума:
--Run Full-Text query to Search for Noise word 'is'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'is')
Резултатът от заявката е по-долу:
Виждаме, че думата „е“ също така успешно е възпрепятствано да стане част от резултата от заявката за пълен текст чрез спестяване на ценни ресурси.
Пълнотекстова заявка за търсене на думата „Здравей“
Изпълняваме заявка за пълен текст, за да търсим думата „Здравей“. Не е част от системния стоп-лист. Следователно заявката трябва да го върне.
--Search Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')
Резултатът е както следва:
Получихме всички записи, съдържащи думата „Здравей.“ Бихме искали обаче да го изключим, тъй като е шумна дума. Ако използваме пълнотекстово търсене в нашия текстов анализ, тази дума може да ни отклони от целта.
Това ни води до третия метод:създаване на стоп-списък от персонализиран или системен стоп-списък.
Създаване на персонализиран стоп-списък от системния стоп-списък
Създайте персонализиран списък за спиране, наречен WatchMasterStoplist от системния стоп-списък със следния T-SQL скрипт:
--Creating a custom stoplist WatchMasterStoplist from system stoplist
CREATE FULLTEXT STOPLIST [WatchMasterStoplist] FROM SYSTEM STOPLIST;
GO
Свързване на нов персонализиран списък за спиране с пълнотекстов индекс
Свържете новосъздадения персонализиран списък за спиране с индекса на пълен текст, както следва:
USE [WatchReviewsMasterStoplist]
GO
-- Associating new custom stoplist with Full-Text index
ALTER FULLTEXT INDEX ON [dbo].[WatchReview] SET STOPLIST = [WatchMasterStoplist]
Проверка на персонализирания списък за спиране чрез търсене на Word „това“
Можете бързо да проверите дали вашият персонализиран стоп-списък включва всички шумови думи от системния списък за спиране. Изпълнете същия код, който използвахме по-рано за търсене на думата „това.“
--Run Full-Text query to Search for Noise word 'this'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')
Този изход трябва да е празен.
Добавяне на нова шумова дума „Здравей“ към персонализирания списък за спиране
Трябва да добавим шумовата дума „Здравей“ към новосъздадения персонализиран списък за спиране. Изпълнете следния скрипт:
--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchMasterStoplist
ADD 'Hi' LANGUAGE 'British English';
Резултатът е по-долу:
Последната проверка
Сега ще изпълним последната проверка на заявката за пълен текст за някои шумови думи – сравняваме я с оригиналния набор от резултати, съдържащ тези шумови думи.
Например, ако се съсредоточим върху четвъртия преглед (подреден по ReviewId ), който съдържа някои шумови думи и след това сравняваме резултатите с резултатите от заявката за пълен текст, не би трябвало да виждаме шумови думи.
Изпълнете следния скрипт, за да извършите окончателната проверка на примерната база данни:
USE WatchReviewsMasterStoplist
-- View the record which contains fourth review
SELECT ReviewId
,[Date]
,Person
,Details
FROM dbo.WatchReview
where ReviewId=4
--Run Full-Text query to Search for Noise words in the fourth review
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'"Hi" OR "this" OR "I" OR "is" OR "and"')
and ReviewId=4
Резултатът е както следва:
Пълнотекстова заявка за търсене на рецензии на цифрови часовници
Сега можем да изпълняваме нашите заявки за пълнотекстово търсене със списъка за спиране на място. Следният T-SQL скрипт ще ни информира за прегледите на цифровите часовници (извадка):
USE WatchReviewsMasterStoplist
--Run Full-Text query to Search for digital watch reviews sample
SELECT * FROM dbo.WatchReview WHERE CONTAINS(Details,'digital')
Резултатите са по-долу:
Честито! Ние успешно приложихме и трите метода за създаване и асоцииране на стоп-списъци. Разгледахме също добавянето на нови думи към стоп-списъците и проверката на ефективността.
Все пак силно препоръчвам третия метод. Създайте персонализиран списък за спиране от системен списък със спирания и след това добавете шумови думи, за да подобрите пълнотекстово търсене.
Неща за правене
Сега, когато сте добре запознати с три метода за създаване на стоп-списъци, може да направите някои упражнения, за да подобрите уменията си за текстов анализ, като следното:
- Добавете персонализиран стоп-списък от системния стоп-списък към примерната база данни, както е в тази статия.
- Създайте персонализиран списък за спиране от системния списък за спиране спрямо примерната база данни, както е в тази статия.
- Изпълнете T-SQL заявка, за да видите добавените спиращи думи, след като се запознаете с тази статия.