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.