Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да използвате Stopwords и Stoplist за подобряване на пълнотекстово търсене на SQL Server (FTS)

Настоящата статия е за използването на Stopwords и Stoplist. Целта е да се направи пълнотекстово търсене по-ефективно по отношение на съхранение и производителност. Освен това, читателите на тази статия ще получат инструкции за внедряване на пълнотекстово търсене със спиращи думи и списък за спиране.

Статията също така подчертава значението на стоп думите и стоп-списъците, за да поддържате прецизното търсене в пълен текст и да избягвате шумови думи.

Разбиране на стоп думи и стоп-списък

Първо, нека изясним същността на Stopwords и Stoplist. След това ще продължим да ги използваме, за да подобрим пълнотекстово търсене.

Списък за спиране

Списъкът за спиране, както подсказва името, е списък със стоп думи. Когато е свързан с пълнотекстово търсене, Stoplist може да филтрира безсмислени думи или термини, като по този начин подобрява резултатите от търсенето.

Стоп дума

Стоп дума е дума, която има второстепенна роля в пълнотекстово търсене, въпреки че е важна граматически. Следователно спирачната дума не е от съществено значение от гледна точка на пълнотекстово търсене.

Според документацията на Microsoft стоп думата може да бъде дума с някакво значение на конкретен език или може да бъде някаква лексема без езикова стойност. И в двата случая е безполезно за пълнотекстово търсене.

Примери за спиращи думи

Следните думи за спиране на (британски/американски) английски език:

  • като
  • в
  • бъди
  • защото
  • той
  • направих

Тъй като горните думи не допринасят за пълнотекстово търсене, те са спиращи думи, въпреки значението им за разбирането на пълно изречение.

Системен(и) списък(и)

Всеки поддържан език, включително британски английски, има списък по подразбиране или система за спиране, който може да бъде модифициран според конкретни изисквания.

Персонализиран(и) списък(и)

Потребителите могат да създават свой собствен/персонализиран списък за спиране, като използват системния списък за спиране или от нулата. Полезно е да предотвратите шумните думи да станат част от резултатите от пълнотекстово търсене.

Езици и стоп-списъци

Пълнотекстово търсене поддържа много различни езици. Всеки от поддържаните езици има поне един системен списък за спиране по подразбиране. Въпреки това може да има множество стоп-списъци за всеки език, включително както системни, така и персонализирани списъци за спиране.

Списък с поддържани езици

Можем бързо да проверим списъка с всички поддържани езици, използвани с пълнотекстово търсене. За това изпълнете следния T-SQL скрипт:

-- List of Full-Text Search supported languages
SELECT ftl.lcid,ftl.name FROM sys.fulltext_languages ftl

Резултатите са както следва:

Заявката към екземпляра на SQL Server 2016 връща общо 53 езика.

Използване на спирателни думи и стоп-списък с пълнотекстово търсене

Сега ще получим малко практически опит за създаване на стоп-списък със стоп думи, дефинирани от потребителя. След това ще го използваме за пълнотекстово търсене като ръководство. Ще бъде точно като сценарий в реално време.

Предварителни условия

На първо място, трябва да осигурите следните изисквания, за да приложите правилно ръководството:

  • Основно разбиране за пълнотекстово търсене
  • Възможността за внедряване на пълнотекстово търсене в SQL Server
  • Наличието на опцията за пълнотекстово търсене е активирана/инсталирана на SQL екземпляр, който планирате да използвате

За да осигурите тези предпоставки, преминете през следващите статии, ако вече сте запознати със скриптовете на T-SQL:

  • Внедряване на пълнотекстово търсене в SQL Server 2016 за начинаещи
  • Внедряване на пълнотекстово търсене в SQL Server 2016 за напреднали потребители

Проверете състоянието на пълнотекстово търсене

Изпълнете следната заявка, за да проверите дали имате инсталиран Full-Text Search във вашия SQL екземпляр:

-- Is Full-Text Search installed then 1 or 0
SELECT fulltextserviceproperty('IsFulltextInstalled') as [Full-Text Search]

Резултатът от горния скрипт трябва да върне 1, както следва:

Ако получавате някакво число, различно от 1, вижте отново споменатите по-горе статии.

Настройте примерна база данни (WatchReviewsStoplist)

Първо, трябва да настроите примерна база данни с име WatchReviewsStoplist . Използвайте следния скрипт:

-- Create WatchReviewsStoplist database
CREATE DATABASE WatchReviewsStoplist;
GO

-- Connect to the sample database
USE WatchReviewsStoplist

-- (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-01-01 00:00:00', N'Atif', 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-01-02 00:00:00', N'Qasim', 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-01-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like alarm, stopwatch, date and timer. ')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-01-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-01-11 00:00:00', N'Sarah', 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

Проверете примерна база данни

Изпълнете следния T-SQL скрипт, за да видите съдържанието на таблицата в примерната база данни:

-- Check sample database
SELECT wr.ReviewId,wr.Person,wr.Details FROM dbo.WatchReview wr

Резултатът е както следва:

Сценарий за спиране

Да приемем, че сме помолили екипа за разработка да подобри пълнотекстовото търсене за отзивите на клиентите. Те трябва да го направят, като изключат шумните думи. По този начин пълнотекстовото търсене остава ефективно и също така фокусирано.

За да изпълним тези изисквания, първо трябва да настроим пълнотекстово търсене. Това означава предприемане на следните действия:

  • Създайте пълнотекстов каталог
  • Създайте празен персонализиран или дефиниран от потребителя списък за спиране
  • Създайте индекс с пълен текст

Създаване на пълнотекстов каталог

Създайте каталог с пълен текст със следния скрипт:

-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO

Създайте празен персонализиран списък за спиране

Създайте празен персонализиран списък със следния скрипт:

-- Create empty custom stoplist
CREATE FULLTEXT STOPLIST [WatchReviewStoplist];
GO  

Сега е създаден персонализиран списък за спиране.

Създаване на пълнотекстов индекс

Накрая създайте индекс с пълен текст в колоната с подробности за британския английски език. Той ще сочи към персонализирания стоп-списък, създаден по-рано. Използвайте следния T-SQL скрипт за това действие:

-- Create Full-Text index pointing to the previously created Stoplist
CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English]) 
   KEY INDEX PK_WatchReview  
   WITH STOPLIST = WatchReviewStoplist;  
GO  

Пълнотекстова заявка, за да получите отличен часовник с оценка от клиенти

Изпълнете следната заявка за пълен текст, за да разберете кой продукт (часовник) е получил отлични оценки от клиентите:

--Search customer reviews where the product was rated excellent
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'excellent') 

Резултатите са по-долу:

Виждаме, че клиентите са дали отлични оценки на черния цифров часовник. Следователно ние знаем най-добрия продукт въз основа на отзиви и разбираме, че пълнотекстовото търсене работи добре.

Все пак има няколко опасения, които може да пренебрегнете за таблица от пет реда, но това може да ни донесе предимства в производителността и съхранението в сравнително голям набор от резултати, ако бъде разгледано своевременно.

Търсете шумна дума „Здравей“ със заявка за пълен текст

Към индекса на пълен текст има много шумови думи. Скоро те могат да се превърнат в тежест. Освен това те не са от полза за търсенето.

Нека проверим дали шумната дума Здравей присъства в резултатите от пълнотекстово търсене, защото е по-добре да го изключите.

Изпълнете заявката за пълен текст, както следва:

--Run Full-Text query to Search for Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Резултатите са по-долу:

Върнатите резултати показват, че думата „Здравей“ е част от резултатите от пълнотекстово търсене. Следователно трябва да го изключим – той е безсмислен за търсенето и не помага на никакъв анализ.

Променете списъка за спиране, за да добавите stopword Hi

Ще добавим спирачната дума Здравей като променим нашия персонализиран Stoplist, така че да не може да бъде индексиран от пълнотекстово търсене и да не се връща от пълнотекстови заявки, за да се спести място и да се подобри търсенето:

--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchReviewStoplist
ADD 'Hi' LANGUAGE 'British English';  

Потърсете отново думата за шум „Здравей“, след като я добавите като стоп дума

Потърсете шумовата дума Здравейте, след като я добавите към списъка за спиране:

--Search Noise word 'Hi' after it has been added as a stopword
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Резултатът е както следва:

Проверете добавените спирателни думи

По всяко време можете да проверите стоп думите, добавени към Stoplist. Изпълнете следния скрипт за това:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Резултатите са по-долу:

Честито! Успешно създадохте списък за спиране и добавихте стоп дума към него. По този начин правите пълнотекстовото търсене по-ефективно както по отношение на производителността, така и при съхранението.

Неща за правене

Сега, когато можете да създавате списъци за спиране и да добавяте спирателни думи към тях, опитайте следното, за да подобрите допълнително уменията си:

  • Добавете думи „аз“, „това“, „просто“, „като шумови думи към вашия персонализиран списък за спиране, създаден в това ръководство.
  • Проверете добавените спиращи думи, като стартирате скрипта, който посочихме в края на ръководството.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SYSDATETIME() Примери в SQL Server (T-SQL)

  2. Как да посоча литерал за дата, когато пиша SQL заявка от SQL Server, който е свързан с Oracle?

  3. Актуализиране на пощенски акаунт в база данни (SSMS)

  4. Вземете лявата част от низ в SQL Server (T-SQL)

  5. Създаване на многоетапна задача за агент на SQL Server (T-SQL)