Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak korzystać z funkcji Stopwords i Stoplist, aby ulepszyć wyszukiwanie pełnotekstowe w programie SQL Server (FTS)

Obecny artykuł dotyczy używania Stopwords i Stoplist. Celem jest zwiększenie wydajności wyszukiwania pełnotekstowego pod względem przechowywania i wydajności. Dodatkowo czytelnicy tego artykułu otrzymają przewodnik dotyczący implementacji wyszukiwania pełnotekstowego ze stoperami i stoplistą.

W artykule podkreślono również znaczenie odrzucanych słów i odrzucanych list (s) dla zachowania dokładności wyszukiwania pełnotekstowego i unikania słów-szumów.

Zrozumienie odrzucanych słów i odrzucanych słów

Najpierw wyjaśnijmy istotę Stopwords i Stoplist. Następnie użyjemy ich do ulepszenia wyszukiwania pełnotekstowego.

Lista stop

Stoplista, jak sama nazwa wskazuje, to lista stopwords. Po powiązaniu z wyszukiwaniem pełnotekstowym, Stoplist może odfiltrować bezsensowne słowa lub terminy, poprawiając w ten sposób wyniki wyszukiwania.

Słowo odrzucające

Stopword to słowo, które odgrywa niewielką rolę w wyszukiwaniu pełnotekstowym, mimo że jest ważne gramatycznie. Dlatego słowo stop nie jest niezbędne z perspektywy wyszukiwania pełnotekstowego.

Zgodnie z dokumentacją Microsoftu stopword może być słowem o pewnym znaczeniu w określonym języku lub może być tokenem bez wartości językowej. W obu przypadkach jest to bezużyteczne w przypadku wyszukiwania pełnotekstowego.

Przykłady odrzucanych słów

Poniżej znajdują się słowa stop w (brytyjskim/amerykańskim) języku angielskim:

  • jako
  • o
  • być
  • ponieważ
  • on
  • zrobił

Ponieważ powyższe słowa nie mają wpływu na wyszukiwanie pełnotekstowe, są to słowa stop, pomimo ich znaczenia w zrozumieniu całego zdania.

Systemowe listy zatrzymania

Każdy obsługiwany język, w tym brytyjski angielski, ma domyślną lub systemową listę stop, którą można modyfikować zgodnie z określonymi wymaganiami.

Niestandardowe listy zatrzymania

Użytkownicy mogą tworzyć własne/niestandardowe stoplisty, korzystając z systemowej listy stoperów lub od podstaw. Pomocne jest zapobieganie sytuacji, w której słowa szumu stają się częścią wyników wyszukiwania pełnotekstowego.

Języki i listy stop

Wyszukiwanie pełnotekstowe obsługuje wiele różnych języków. Każdy z obsługiwanych języków ma domyślnie co najmniej jedną listę zatrzymania systemu. Jednak może istnieć wiele list zatrzymania dla dowolnego języka, w tym zarówno systemowe, jak i niestandardowe listy zatrzymania.

Lista obsługiwanych języków

Możemy szybko sprawdzić listę wszystkich obsługiwanych języków używanych w wyszukiwaniu pełnotekstowym. W tym celu uruchom następujący skrypt T-SQL:

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

Wyniki są następujące:

Zapytanie w instancji SQL Server 2016 zwraca łącznie 53 języki.

Korzystanie ze stoper i stoplisty z wyszukiwaniem pełnotekstowym

Teraz zdobędziemy praktyczne doświadczenie w tworzeniu listy stop-słów zdefiniowanych przez użytkownika. Następnie użyjemy go do wyszukiwania pełnotekstowego jako przewodnika. To będzie jak scenariusz w czasie rzeczywistym.

Wymagania wstępne

Przede wszystkim musisz spełnić następujące wymagania, aby poprawnie zaimplementować przewodnik:

  • Posiadanie podstawowej wiedzy na temat wyszukiwania pełnotekstowego
  • Możliwość implementacji wyszukiwania pełnotekstowego w SQL Server
  • Obecność włączonej/zainstalowanej opcji wyszukiwania pełnotekstowego w instancji SQL, której planujesz użyć

Aby spełnić te wymagania, zapoznaj się z poniższymi artykułami, jeśli znasz już skrypty T-SQL:

  • Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących
  • Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla zaawansowanych użytkowników

Sprawdź stan wyszukiwania pełnotekstowego

Uruchom następujące zapytanie, aby sprawdzić, czy masz zainstalowane wyszukiwanie pełnotekstowe w swojej instancji SQL:

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

Wynik powyższego skryptu powinien zwrócić 1 w następujący sposób:

Jeśli otrzymasz inną liczbę niż 1, ponownie zapoznaj się z artykułami wspomnianymi powyżej.

Ustaw przykładową bazę danych (WatchReviewsStoplist)

Najpierw musisz skonfigurować przykładową bazę danych o nazwie WatchReviewsStoplist . Użyj poniższego skryptu:

-- 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

Sprawdź przykładową bazę danych

Uruchom następujący skrypt T-SQL, aby wyświetlić zawartość tabeli w przykładowej bazie danych:

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

Dane wyjściowe są następujące:

Scenariusz listy stop

Załóżmy, że poprosiliśmy zespół programistów o ulepszenie wyszukiwania pełnotekstowego opinii klientów. Powinni to zrobić, wykluczając słowa dźwiękowe. W ten sposób wyszukiwanie pełnotekstowe pozostaje wydajne i skoncentrowane.

Aby spełnić te wymagania, musimy najpierw skonfigurować wyszukiwanie pełnotekstowe. Oznacza to podjęcie następujących działań:

  • Utwórz katalog pełnotekstowy
  • Utwórz pustą niestandardową lub zdefiniowaną przez użytkownika listę stop
  • Utwórz indeks pełnotekstowy

Utwórz katalog pełnotekstowy

Utwórz katalog pełnotekstowy za pomocą następującego skryptu:

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

Utwórz pustą niestandardową listę stop

Utwórz pustą niestandardową listę stop za pomocą następującego skryptu:

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

Utworzono niestandardową listę stop.

Utwórz indeks pełnotekstowy

Na koniec utwórz indeks pełnotekstowy w kolumnie Szczegóły dla brytyjskiego języka angielskiego. Wskazuje na utworzoną wcześniej niestandardową listę stop. W tym celu użyj następującego skryptu 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  

Pełnotekstowe zapytanie, aby uzyskać doskonały zegarek oceniony przez klientów

Uruchom następujące zapytanie pełnotekstowe, aby dowiedzieć się, który produkt (zegarek) otrzymał doskonałe oceny od klientów:

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

Wyniki są poniżej:

Widzimy, że klienci wystawili doskonałe oceny czarnemu zegarkowi cyfrowemu. Dlatego znamy najlepszy produkt na podstawie recenzji i rozumiemy, że wyszukiwanie pełnotekstowe działa dobrze.

Mimo to istnieje kilka obaw, które można zignorować w przypadku tabeli składającej się z pięciu wierszy, ale może to zapewnić nam korzyści w zakresie wydajności i przestrzeni dyskowej w stosunkowo dużym zestawie wyników, jeśli zostanie szybko rozwiązane.

Wyszukaj słowo szumu „Cześć” za pomocą zapytania pełnotekstowego

Do indeksu pełnotekstowego dołączonych jest wiele słów zakłócających. Wkrótce mogą stać się ciężarem. Poza tym nie przydają się do wyszukiwania.

Sprawdźmy, czy słowo szumu Cześć jest obecny w wynikach wyszukiwania pełnotekstowego, ponieważ lepiej jest go wykluczyć.

Uruchom zapytanie pełnotekstowe w następujący sposób:

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

Wyniki są poniżej:

Zwrócone wyniki pokazują, że słowo „Cześć” jest częścią wyników wyszukiwania pełnotekstowego. Dlatego musimy go wykluczyć – nie ma to znaczenia dla wyszukiwania i nie pomaga w żadnej analizie.

Zmień Stoplistę, aby dodać Stopword Cześć

Dodamy odrzucone słowo Cześć zmieniając naszą niestandardową listę stop, tak aby nie mogła być indeksowana przez wyszukiwanie pełnotekstowe i nie powinna być zwracana przez zapytania pełnotekstowe, aby zaoszczędzić miejsce i usprawnić wyszukiwanie:

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

Ponownie wyszukaj słowo szumu „Cześć” po dodaniu go jako Stopword

Wyszukaj słowo szumu Hi po dodaniu go do listy stop:

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

Dane wyjściowe są następujące:

Sprawdź dodane odrzucane słowa

W każdej chwili możesz sprawdzić stopwords dodane do Stoplisty. Uruchom w tym celu następujący skrypt:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Wyniki są poniżej:

Gratulacje! Pomyślnie utworzyłeś stoplistę i dodałeś do niej stopword. W ten sposób wyszukiwanie pełnotekstowe jest bardziej wydajne zarówno pod względem wydajności, jak i przechowywania.

Rzeczy do zrobienia

Teraz, gdy możesz tworzyć stoplisty i dodawać do nich stopwordy, wypróbuj następujące rozwiązania, aby jeszcze bardziej poprawić swoje umiejętności:

  • Dodaj słowa „ja”, „to”, „po prostu”, „jako słowa dźwiękowe do niestandardowej listy stoperów utworzonej w tym przewodniku.
  • Sprawdź dodane odrzucane słowa, uruchamiając skrypt, który określiliśmy na końcu przewodnika.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server w systemie Linux

  2. Jakie jest najlepsze narzędzie do porównania dwóch baz danych SQL Server (schematu i danych)?

  3. Zapytanie aktualizujące SQL za pomocą złączeń

  4. Utwórz tabelę partycjonowaną w SQL Server (T-SQL)

  5. Jaka jest różnica między Scope_Identity(), Identity(), @@Identity i Ident_Current()?