sql >> Databasteknik >  >> RDS >> Sqlserver

Implementering av fulltextsökning i SQL Server 2016 för avancerade användare

Den här artikeln berättar om avancerade metoder för användning av fulltextsökning för dataproffs. Det möjliggör bättre sökupplevelse i deras dagliga databasanalys.

Dessutom kommer läsarna att komma bortom grundläggande kunskaper om Full-Text Search och dess implementering. Du kommer att se vikten av avancerad sökmetod som använder fulltextsökning för att få snabba och pålitliga resultat.

Förutsättningar

Låt oss först gå igenom förutsättningarna eftersom artikeln är fokuserad på avancerad användning av fulltextsökning.

T-SQL Know-How

Artikeln förutsätter att för att implementera genomgången(erna) är läsarna bekanta med att skriva och köra T-SQL-skript mot databaser med en grundläggande förståelse för SQL Server.

Grunderna för fulltextsökning

Den här artikeln förväntar sig också att läsarna ska ha en grundläggande förståelse för fulltextsökning.

Se Implementera fulltextsökning i SQL Server 2016 för nybörjare artikel om du vill bekanta dig med grundläggande begrepp och implementering av Full-Text Search via genomgång(er).

Installation av fulltextsökning

Låt oss anta att Full-Text Search redan har lagts till i din SQL-instans.

Om du inte har gjort det ännu, följ instruktionerna i Implementera fulltextsökning i SQL Server 2016 för nybörjare artikel som hjälper dig att installera Full-Text Search till din SQL-instans.

Du kan kontrollera statusen för fulltextsökning genom att köra följande skript:

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

Exempeldatabas SQLDevBlogV7

Skapa och fyll i en exempeldatabas som heter SQLDevBlogV7 med Anteckningar kolumn för VARCHAR(MAX) typ. För att göra det, kör följande T-SQL-skript mot huvuddatabasen:

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

Skapa fulltextkatalog

Skapa fulltextkatalog med skriptet nedan eller med hjälp av installationsguiden:

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

Definiera fulltextindex på anteckningar

När katalogen har skapats framgångsrikt, definiera ett fulltextindex baserat på Anteckningar kolumn enligt följande (eller genom att använda installationsguiden):

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

Fulltextkatalog och fulltextindexkontroll

Expandera relaterade noder för att se Full-Text Index och Full-Text Catalogue som du just har skapat:

Nu är du redo att köra fulltextfrågor mot intressetabellen – i vårt fall är det Artikel .

Enkel term

Att söka efter ett ord eller en fras är lättare än att söka efter andra former, så det är också känt som en enkel term.

Se Implementera fulltextsökning i SQL Server 2016 för nybörjare artikel för att implementera en grundläggande form av en fulltextfråga för att söka efter ett ord eller en fras.

Låt oss nu diskutera några av de potentiella avancerade sökningar som görs med fulltextsökning.

Avancerad fulltextsökning med prefixterm

En prefixterm syftar på ett prefixord som börjar med några bokstäver – det kan då vara vad som helst som matchar det mönstret. Du kan se det som en fulltextsökningsversion av GILLA med prefix*.

Ett eller flera ord i en fras kan också ha prefixterm(er).

Exempel

Till exempel att söka efter ordet data* kan ge oss allt som börjar med data i den kolumnen som data, databas, databaser, etc.

Utvecklarrelaterade artiklar Sök med prefixterm

Låt oss föreställa oss att du har i uppdrag att söka efter utvecklingsrelaterade artiklar för att organisera dem i en separat utvecklingsgrupp för bättre webbupplevelse.

Lösningen är "prefix term search" med hjälp av en fulltextfråga enligt följande:

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

Resultaten visade också artikeln om DevOps – det är inte utvecklingsrelaterat, det är därför vi kör ett annat skript. Den hittar alla dev-relaterade artiklar snabbare med en fulltextfråga, exklusive DevOps enligt följande:

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

Utgången är som följer:

Observera att det är viktigt att sätta sökordet inom dubbla citattecken som visas i skripten ovan. Genom att göra detta implementerar vi prefixtermsökningen korrekt.

Avancerad fulltextsökning med böjningsform

Ibland behöver du söka efter böjningsformer av ett ord som betyder möjliga former som ett ord kan ta.

Exempel

Ett enkelt exempel är ordet "Deploy" som kan ha följande böjningsformer:

  1. Distribuerar
  2. Distribuerat
  3. Implementering
  4. Isättningar
  5. Distribuerar

Böjningsformer av skrivsökning

Låt oss se vad som händer om vi kör en fulltextfråga för att hitta anteckningar för alla böjningsformer av ordet skriv:

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

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

Anteckningskolumnen med rader som innehåller både skriv och skriva visas där skriver är en böjningsform av skriva .

Böjningsformer av tekniksökning

Om du får i uppdrag att hitta alla artiklar som innehåller olika former av teknikordet, implementera sedan en böjningsform av ordsökningen med hjälp av följande T-SQL-skript:

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

Utgången är som följer:

Ingen sökning av prefixtermer

Låt oss nu konstruera en mer komplex fulltextfråga. Den kommer att söka efter alla artiklar för att hitta en böjningsform av ordet test men utan prefixterm enhet (exklusive enhetstestning) eftersom vi letar efter artiklarna om testning, inte om enhetstestning:

-- 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*"')

Som ett resultat kommer vi bara att se poster där manuella , automatiserad, eller bara testa ord nämns exklusive enhetstestning artiklar.

Avancerad fulltextsökning med närhetssökning

Låt oss använda vår praktiska erfarenhet av att använda närhetssökning genom att köra en fulltextfråga.

Närhetssökning/Term

Denna form av fulltextsökning låter dig söka efter ord eller fraser som ligger nära varandra. Det är väldigt praktiskt att hitta poster när vissa ord eller fraser är väldigt snäva.

Exempel

Ett bra exempel på en närhetssökning är att söka efter poster där ordet fotboll är nära ordet jord för att bara få information om fotbollsplaner.

Sök efter "avancerad nära-testning" med hjälp av närhetsterm

Om du vill söka efter alla artiklar där avancerade tester nämns utan att följa någon särskild ordning, är ditt bästa alternativ att använda närhetssökning med tanke på att Full-Text Search ställs in mot önskad kolumn.

Skriv följande skript för att söka efter ordet avancerat nära ordet testning i valfri ordning i kolumnen Anteckningar:

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

Resultaten är följande:

Resultaten visade oss anteckningarna där testning nämns med metoder på avancerad nivå och det var detta vi letade efter. Vi kan också ange avståndet mellan två ord.

Söker med högst två ord från varandra

Slutligen, kör en fulltextfråga med hjälp av närhetsterm för att ta reda på varje databasscenario där ordet databas är nära ordet scenario men inte mer än två ord från varandra.

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

Utgången är som följer:

Som ett resultat, artikeln där databasutvecklingsscenario nämns har visats framgångsrikt.

Med detta har du framgångsrikt lärt dig att skriva avancerade fulltextfrågor mot valfri kolumn. Detta hjälper dig att möta sofistikerade sökkrav för att vara redo att köra fulltextsökning i dina scenarier i ditt yrkesliv där det är tillämpligt.

Saker att göra

Nu när du kan skriva avancerade fulltextfrågor bör du prova dessa saker för att förbättra dina färdigheter:

  1. Försök att söka efter alla artiklar med prefixet auto används.
  2. Tänk på den här artikeln och försök att skriva ett skript för att göra närhetssökning för att hitta alla rader där ordet modern är nära ordet verktyg .
  3. Försök hitta alla böjningsformer av ordet skrev .

  1. Sätt att prova flera SELECT tills ett resultat är tillgängligt?

  2. INFOGA rader i flera tabeller i en enda fråga, välj från en involverad tabell

  3. Kan en Check-begränsning relatera till en annan tabell?

  4. Hur hittar man MySQL-databasens plats på hårddisken?