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

Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla zaawansowanych użytkowników

W tym artykule omówiono zaawansowane metody korzystania z wyszukiwania pełnotekstowego przez specjalistów ds. danych. Umożliwia lepsze wyszukiwanie w codziennej analizie bazy danych.

Dodatkowo czytelnicy wykroczą poza podstawową wiedzę na temat wyszukiwania pełnotekstowego i jego implementacji. Zobaczysz, jak ważna jest zaawansowana metodologia wyszukiwania wykorzystująca wyszukiwanie pełnotekstowe w celu uzyskania szybkich i wiarygodnych wyników.

Wymagania wstępne

Najpierw przejdźmy przez wymagania wstępne, ponieważ artykuł koncentruje się na zaawansowanych zastosowaniach wyszukiwania pełnotekstowego.

Wiedza dotycząca T-SQL

Artykuł zakłada, że ​​aby zaimplementować instrukcje, czytelnicy są zaznajomieni z pisaniem i uruchamianiem skryptów T-SQL w bazach danych z podstawową wiedzą na temat SQL Server.

Podstawy wyszukiwania pełnotekstowego

W tym artykule oczekujemy również, że czytelnicy będą mieli podstawową wiedzę na temat wyszukiwania pełnotekstowego.

Proszę zapoznać się z Implementacją wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących artykuł, jeśli chcesz zapoznać się z podstawowymi koncepcjami i implementacją wyszukiwania pełnotekstowego za pomocą instrukcji.

Instalacja wyszukiwania pełnotekstowego

Załóżmy, że wyszukiwanie pełnotekstowe zostało już dodane do Twojej instancji SQL.

Jeśli jeszcze tego nie zrobiłeś, postępuj zgodnie z instrukcjami w Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących artykuł, który pomoże Ci zainstalować wyszukiwanie pełnotekstowe w Twojej instancji SQL.

Możesz sprawdzić stan wyszukiwania pełnotekstowego, wykonując następujący skrypt:

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

Przykładowa baza danych SQLDevBlogV7

Teraz utwórz i wypełnij przykładową bazę danych o nazwie SQLDevBlogV7 mając Notatki kolumna VARCHAR(MAX) rodzaj. Aby to zrobić, uruchom następujący skrypt T-SQL na głównej bazie danych:

-- Create sample database (SQLDevBlogV7)
CREATE DATABASE SQLDevBlogV7;
GO


USE SQLDevBlogV7;


-- (1) Create Article table in the sample database
CREATE TABLE [dbo].[Article] (
[ArticleId] INT IDENTITY (1, 1) NOT NULL,
[Category] VARCHAR (50) NULL,
[Author] VARCHAR (50) NULL,
[Title] VARCHAR (150) NULL,
[Published] DATETIME2 (7) NULL,
[Notes] VARCHAR (MAX) NULL,
CONSTRAINT [PK_Article] PRIMARY KEY (ArticleId)

);

GO

-- Reset tabular data
TRUNCATE TABLE dbo.Article
GO

-- Add data to the table
SET IDENTITY_INSERT [dbo].[Article] ON

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (1, N'Development', N'Atif', N'Introduction to T-SQL Programming ', N'2017-01-01 00:00:00', N'The article is about T-SQL programming covering most commonly used statements including SELECT.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (2, N'Testing', N'Peter', N'Database Unit Testing Fundamentals', N'2017-01-10 00:00:00', N'This is a database unit testing article to get familiar with unit testing with the help of examples and walkthroughs.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (3, N'Data Analysis', N'Haroon', N'Learn Basic Data Analysis with SQL Window Functions', N'2019-06-12 00:00:00', N'This article is about T-SQL (Transact-SQL) Window functions and their basic use in day-to-day data analysis tasks.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (4, N'Development', N'Peter', N'Common Table Expressions (CTE)', N'2017-02-10 00:00:00', N'This is an article which explains how to use CTE in T-SQL to write complex queries.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (5, N'Testing', N'Sadaf', N'Manual Testing vs. Automated Testing', N'2017-03-20 00:00:00', N'This article is based on the comparative anlaysis between manual testing and automated testing. This article uses tSQLt to give examples of automated testing.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (6, N'Testing', N'Atif', N'Beyond Database Unit Testing', N'2017-11-10 00:00:00', N'There is a lot to do when it comes to the database unit testing and this article is more about the some advanced level methods to write and run SQL unit tests using tSQLt.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (7, N'Testing', N'Sadaf', N'Cross Database Unit Testing', N'2017-12-20 00:00:00', N'This article covers a complex scenario of cross database unit testing using 3rd party testing tools.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (8, N'Development', N'Haroon', N'How to Properly Use the T-SQL IsNumeric Function', N'2018-01-10 00:00:00', N'This is about IsNumeric function which determines whether an expression can be evaluated as a number. Here, the expression can consist of symbols and operators which are evaluated as a single data value by SQL Server Database Engine.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (9, N'Testing', N'Sadaf', N'Scripting and Testing Database for beginners ', N'2018-02-15 00:00:00', N'This article is based on the scripting and testing of SQL databases using modern tools and technologies.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (10, N'Development', N'Atif', N'Advanced Database Development Methods', N'2018-07-10 00:00:00', N'This article talks about modern database development tools including SSDT, SSMS etc.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (11, N'Testing', N'Sadaf', N'How to Write Unit Tests for your Database', N'2018-11-10 00:00:00', N'This article is about writing unit testing for your database using MSTest.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (12, N'Development', N'Peter', N'Database Development using Modern Tools', N'2018-12-10 00:00:00', N'In this aritlce a database development scenario is dicussed using SQL Server Data Tools and SQL Server Management Studio. ')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (13, N'DLM', N'Atif', N'Designing, Developing and Deploying Database', N'2019-01-01 00:00:00', N'The concepts around Azure DevOps and their implementation is the main focus of this article.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (14, N'DLM', N'Peter', N'How to Apply Database Lifecycle Management', N'2019-02-10 00:00:00', N'This article is about DLM.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (15, N'Testing', N'Saqib', N'SQL Unit Testing Stored Procedures', N'2019-03-10 00:00:00', N'This article talks about how to write unit tests for a procedure.')

INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (16, N'Reporting', N'Haroon', N'SSRS Reports Development in Simple Terms', N'2019-07-10 22:26:42', N'The article is dedicated to the fundamentals of SQL Server Reporting Services (SSRS) development and aimed at beginners and professionals interested in database development.')

SET IDENTITY_INSERT [dbo].[Article] OFF

Utwórz katalog pełnotekstowy

Utwórz katalog pełnotekstowy za pomocą poniższego skryptu lub kreatora konfiguracji:

-- Create Full-Text Catalog
CREATE FULLTEXT CATALOG ArticleCatalog AS DEFAULT;
GO

Zdefiniuj indeks pełnotekstowy w notatkach

Po pomyślnym utworzeniu katalogu zdefiniuj indeks pełnotekstowy na podstawie Uwag kolumnę w następujący sposób (lub za pomocą kreatora konfiguracji):

-- Define Full-Text Index
CREATE FULLTEXT INDEX ON dbo.Article(Notes)
KEY INDEX PK_Article
WITH STOPLIST = SYSTEM;
GO

Katalog pełnotekstowy i kontrola indeksu pełnotekstowego

Rozwiń powiązane węzły, aby zobaczyć indeks pełnotekstowy i katalog pełnotekstowy, które właśnie utworzyłeś:

Teraz jesteś gotowy do uruchamiania zapytań pełnotekstowych względem tabeli zainteresowań — w naszym przypadku jest to artykuł .

Prosty termin

Wyszukiwanie słowa lub frazy jest łatwiejsze niż wyszukiwanie innych form, dlatego jest również nazywane prostym terminem.

Zapoznaj się z Implementacją wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących artykuł do zaimplementowania podstawowej formy zapytania pełnotekstowego w celu wyszukania słowa lub frazy.

Omówmy teraz niektóre z potencjalnych zaawansowanych wyszukiwań wykonanych przy użyciu wyszukiwania pełnotekstowego.

Zaawansowane wyszukiwanie pełnotekstowe z użyciem prefiksu

Termin prefiksowy odnosi się do słowa z prefiksem zaczynającego się od kilku liter – może to być wtedy wszystko, co pasuje do tego wzorca. Możesz myśleć o tym jako o wersji wyszukiwania pełnotekstowego LIKE z przedrostkiem*.

Słowo lub słowa w wyrażeniu mogą również mieć przedrostek (terminy).

Przykład

Na przykład wyszukiwanie słowa dane* może dać nam wszystko, zaczynając od danych w tej kolumnie, takich jak dane, baza danych, bazy danych itp.

Wyszukiwanie artykułów związanych z programistami przy użyciu terminu prefiksu

Wyobraźmy sobie, że masz za zadanie wyszukać artykuły związane z programowaniem, aby uporządkować je w oddzielnej grupie programistycznej, aby zapewnić lepsze wrażenia z oglądania witryny.

Rozwiązaniem jest „wyszukiwanie terminów przedrostkowych” przy użyciu zapytania pełnotekstowego w następujący sposób:

--Implementing Prefix Term Full-Text Seach to find dev related articles
SELECT Title,Notes FROM dbo.Article WHERE CONTAINS(NOTES,'"dev*"')

Wyniki pokazały również artykuł o DevOps – to nie jest związane z dev, dlatego uruchamiamy kolejny skrypt. Szybciej znajdzie wszystkie artykuły związane z programistami za pomocą zapytania pełnotekstowego, z wyjątkiem DevOps w następujący sposób:

--Implementing Prefix Term Full-Text Seach to find dev related articles but not DevOps
SELECT Title,Notes FROM dbo.Article WHERE CONTAINS(NOTES,'"dev*"') AND NOT CONTAINS(Notes,'DevOps')

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

Pamiętaj również, że konieczne jest umieszczenie wyszukiwanego słowa w podwójnych cudzysłowach, jak pokazano w powyższych skryptach. W ten sposób prawidłowo zaimplementujemy wyszukiwanie prefiksu.

Zaawansowane wyszukiwanie pełnotekstowe przy użyciu formy fleksyjnej

Czasami trzeba poszukać form fleksyjnych słowa, które oznaczają możliwe formy, jakie może przybrać słowo.

Przykład

Prostym przykładem jest słowo „Wdrażanie”, które może mieć następujące formy fleksyjne:

  1. Wdraża
  2. Wdrożono
  3. Wdrożenie
  4. Wdrożenia
  5. Wdrażanie

Formy fleksyjne wyszukiwania z zapisem

Zobaczmy, co się stanie, jeśli uruchomimy zapytanie pełnotekstowe, aby znaleźć uwagi dla wszystkich form fleksyjnych słowa write:

-- Searching inflectional forms of word write using Full-Text Search

SELECT Title,Notes FROM dbo.Article WHERE CONTAINS(NOTES,'FORMSOF(INFLECTIONAL,write)')

Kolumna Notatki z wierszami zawierającymi zarówno zapis i pisanie są pokazane, gdzie pisanie jest fleksyjną formą write .

Odmienne formy wyszukiwania technologii

Jeśli Twoim zadaniem jest znalezienie wszystkich artykułów zawierających różne formy słowa technologicznego, zaimplementuj fleksyjną formę wyszukiwania słów za pomocą następującego skryptu T-SQL:

-- Searching inflectional forms of word technology using Full-Text Search
SELECT Title,Notes FROM dbo.Article WHERE CONTAINS(NOTES,'FORMSOF(INFLECTIONAL,technology)')

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

Brak wyszukiwania jednostek terminu prefiksu

Skonstruujmy teraz bardziej złożone zapytanie pełnotekstowe. Przeszuka wszystkie artykuły, aby znaleźć fleksyjną formę słowa test ale bez prefiksu jednostka (z wyłączeniem testów jednostkowych), ponieważ szukamy artykułów o testowaniu, a nie o testowaniu jednostkowym:

-- Searching inflectional forms of word test excluding unit prefix term using Full-Text Search
SELECT Title,Notes FROM dbo.Article WHERE CONTAINS(NOTES,'FORMSOF(INFLECTIONAL,test)') AND NOT CONTAINS(NOTES,'"unit*"')

W rezultacie zobaczymy tylko rekordy, w których ręcznie , zautomatyzowane, lub po prostu testowanie słowa są wymienione z wyłączeniem testów jednostkowych artykuły.

Zaawansowane wyszukiwanie pełnotekstowe za pomocą wyszukiwania zbliżeniowego

Skorzystajmy z naszego praktycznego doświadczenia w korzystaniu z wyszukiwania zbliżeniowego, uruchamiając zapytanie pełnotekstowe.

Wyszukiwanie/Termin zbliżeniowy

Ta forma wyszukiwania pełnotekstowego umożliwia wyszukiwanie słów lub fraz, które są blisko siebie. Bardzo przydatne jest znajdowanie rekordów, gdy niektóre słowa lub frazy znajdują się bardzo ciasno.

Przykład

Dobrym przykładem wyszukiwania bliskości jest wyszukiwanie rekordów, w których słowo piłka nożna znajduje się w pobliżu słowa ziemi aby uzyskać informacje tylko o boiskach piłkarskich.

Wyszukaj „zaawansowane testy bliskie” za pomocą terminu zbliżeniowego

Jeśli chcesz wyszukać wszystkie artykuły, w których wspomniano o zaawansowanym testowaniu, bez zachowania określonej kolejności, najlepszą opcją jest użycie wyszukiwania zbliżonego, biorąc pod uwagę, że wyszukiwanie pełnotekstowe jest ustawione w żądanej kolumnie.

Napisz następujący skrypt, aby wyszukać słowo zaawansowane w pobliżu słowa testowanie w dowolnej kolejności w kolumnie Notatki:

-- Search for word advanced near word testing using proximity search (Full-Text Search)
SELECT NOTES FROM dbo.Article WHERE CONTAINS (NOTES,'NEAR(advanced,testing)')

Wyniki są następujące:

Wyniki pokazały nam notatki, w których testowanie jest wymieniane przez metody na poziomie zaawansowanym i tego właśnie szukaliśmy. Możemy również określić odległość między dwoma słowami.

Wyszukiwanie w odległości nie większej niż 2 słowa

Na koniec uruchom zapytanie pełnotekstowe, używając terminu zbliżeniowego, aby znaleźć każdy scenariusz bazy danych, w którym słowo baza danych jest blisko słowa scenariusz ale nie więcej niż 2 słowa od siebie.

-- Search for word database near word scenario not more than 2 words apart using proximity search (Full-Text Search)
SELECT NOTES FROM dbo.Article WHERE CONTAINS (NOTES,'NEAR((database,scenario),2,TRUE)')

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

W rezultacie artykuł, w którym scenariusz rozwoju bazy danych zostało pokazane pomyślnie.

Dzięki temu z powodzeniem nauczyłeś się pisać zaawansowane zapytania pełnotekstowe w dowolnej kolumnie. Pomaga to spełnić wyrafinowane wymagania wyszukiwania, aby być gotowym do uruchomienia wyszukiwania pełnotekstowego w scenariuszach życia zawodowego, gdziekolwiek ma to zastosowanie.

Rzeczy do zrobienia

Teraz, gdy możesz pisać zaawansowane zapytania pełnotekstowe, powinieneś spróbować następujących rzeczy, aby poprawić swoje umiejętności:

  1. Spróbuj wyszukać wszystkie artykuły, w których przedrostek auto jest używany.
  2. Mając na uwadze ten artykuł, spróbuj napisać skrypt do wyszukiwania zbliżeniowego, aby znaleźć wszystkie wiersze, w których słowo nowoczesne jest blisko słowa narzędzia .
  3. Spróbuj znaleźć wszystkie formy fleksyjne słowa napisane .

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj z DateTime na INT

  2. Jak dynamicznie mapować kolumny wejściowe i wyjściowe w SSIS?

  3. Jak używać DOWOLNEGO / NIEKTÓREGO operatora logicznego w SQL Server — samouczek SQL Server / TSQL, część 127

  4. Użyj TYPEPROPERTY(), aby zwrócić informacje o typie danych w SQL Server

  5. Jak filtrować wiersze z wartościami null w instrukcji Select w SQL Server — samouczek SQL Server / TSQL, część 110