sql >> Database >  >> RDS >> Sqlserver

Full-Text Search implementeren in SQL Server 2016 voor geavanceerde gebruikers

Dit artikel vertelt over geavanceerde methoden voor het gebruik van Full-Text Search voor dataprofessionals. Het zorgt voor een betere zoekervaring in hun dagelijkse database-analyse.

Bovendien zullen de lezers verder gaan dan de basiskennis van Full-Text Search en de implementatie ervan. U zult het belang inzien van geavanceerde zoekmethodes die Full-Text Search gebruiken om snelle en betrouwbare resultaten te krijgen.

Vereisten

Laten we eerst de vereisten doornemen, aangezien het artikel is gericht op geavanceerd gebruik van zoeken in volledige tekst.

T-SQL-knowhow

Het artikel gaat ervan uit dat de lezers, om de walk-through(s) te implementeren, bekend zijn met het schrijven en uitvoeren van T-SQL-scripts voor databases met een basiskennis van SQL Server.

Basisprincipes van zoeken in volledige tekst

Dit artikel verwacht ook dat de lezers een basiskennis hebben van zoeken in volledige tekst.

Raadpleeg de Implementatie van zoeken in volledige tekst in SQL Server 2016 voor beginners artikel als u vertrouwd wilt raken met basisconcepten en implementatie van Full-Text Search via walk-through(s).

Installatie voor zoeken in volledige tekst

Laten we aannemen dat zoeken in volledige tekst al is toegevoegd aan uw SQL-instantie.

Als u dit nog niet hebt gedaan, volgt u de instructies in Implementeren van zoeken in volledige tekst in SQL Server 2016 voor beginners artikel om u te helpen zoeken in volledige tekst op uw SQL-instantie te installeren.

U kunt de status van Zoeken in volledige tekst controleren door het volgende script uit te voeren:

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

Voorbeelddatabase SQLDevBlogV7

Maak en vul nu een voorbeelddatabase met de naam SQLDevBlogV7 met Notities kolom van VARCHAR(MAX) type. Om dit te doen, voert u het volgende T-SQL-script uit op de hoofddatabase:

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

Maak een volledige tekstcatalogus

Maak een volledige tekstcatalogus met behulp van het onderstaande script of met behulp van de installatiewizard:

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

Definieer de volledige tekstindex op notities

Nadat de catalogus met succes is gemaakt, definieert u een Full-Text Index op basis van de Opmerkingen kolom als volgt (of met behulp van de installatiewizard):

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

Full-Text Catalogus en Full-Text Index Check

Vouw gerelateerde knooppunten uit om de volledige tekstindex en de volledige tekstcatalogus te zien die u zojuist hebt gemaakt:

Nu bent u klaar om Full-Text-query's uit te voeren tegen de tabel van interesse - in ons geval is dit Artikel .

Eenvoudige term

Zoeken naar een woord of een zin is gemakkelijker dan zoeken naar andere vormen, daarom wordt het ook wel een eenvoudige term genoemd.

Raadpleeg de Implementatie van zoeken in volledige tekst in SQL Server 2016 voor beginners artikel om een ​​basisvorm van een Full-Text-query te implementeren om naar een woord of een zin te zoeken.

Laten we nu enkele van de mogelijke geavanceerde zoekopdrachten bespreken die zijn gemaakt met Zoeken in volledige tekst.

Geavanceerd zoeken in volledige tekst met voorvoegsel

Een prefix-term verwijst naar een voorvoegsel dat met enkele letters begint - het kan dan alles zijn dat overeenkomt met dat patroon. Je kunt het zien als een Full-Text Search-versie van LIKE met voorvoegsel*.

Een woord of woorden binnen een zin kunnen ook prefixterm(en) hebben.

Voorbeeld

Bijvoorbeeld zoeken op het woord data* kan ons alles bezorgen dat begint met gegevens in die kolom, zoals gegevens, database, databases, enz.

Dev-gerelateerde artikelen zoeken met prefixterm

Stel je voor dat je de taak hebt om te zoeken naar ontwikkelingsgerelateerde artikelen om ze in een aparte ontwikkelgroep te ordenen voor een betere kijkervaring op de website.

De oplossing is 'zoeken op prefix-term' met behulp van een Full-Text-query als volgt:

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

De resultaten toonden ook het artikel over DevOps - het is niet dev-gerelateerd, daarom draaien we een ander script. Het zal alle dev-gerelateerde artikelen sneller vinden met behulp van een Full-Text-query, met uitzondering van DevOps als volgt:

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

De uitvoer is als volgt:

Houd er rekening mee dat het essentieel is om het zoekwoord tussen dubbele aanhalingstekens te plaatsen, zoals weergegeven in de bovenstaande scripts. Door dit te doen, implementeren we het zoeken naar de prefix term correct.

Geavanceerd zoeken in volledige tekst met verbuigingsvorm

Soms moet je zoeken naar verbuigingsvormen van een woord, wat betekent dat een woord mogelijke vormen kan aannemen.

Voorbeeld

Een eenvoudig voorbeeld is het woord "Deploy" dat de volgende verbuigingsvormen kan hebben:

  1. Implementeert
  2. Geïmplementeerd
  3. Implementatie
  4. Implementaties
  5. Implementeren

Inflectionele vormen van zoeken op schrijven

Laten we eens kijken wat er gebeurt als we een Full-Text-query uitvoeren om notities te vinden voor alle verbuigingsvormen van het woord write:

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

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

De kolom Opmerkingen met rijen die zowel write . bevatten en schrijven worden weergegeven waar schrijven is een verbuigingsvorm van schrijven .

Inflectionele vormen van technologie zoeken

Als je de taak hebt om alle artikelen te vinden die verschillende vormen van het technologiewoord bevatten, implementeer dan een verbuigingsvorm van het woord zoeken met behulp van het volgende T-SQL-script:

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

De uitvoer is als volgt:

Geen Prefix Term Unit Search

Laten we nu een complexere Full-Text-query maken. Het zoekt naar alle artikelen om een ​​verbuigingsvorm van het woord test . te vinden maar zonder voorvoegsel eenheid (exclusief unit-testen) omdat we op zoek zijn naar de artikelen over testen, niet over unit-testen:

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

Als gevolg hiervan gaan we alleen records zien waar handmatig , geautomatiseerd, of gewoon testen woorden worden genoemd met uitzondering van unit testing artikelen.

Geavanceerd zoeken in volledige tekst met Proximity Search

Laten we onze praktische ervaring met het gebruik van zoeken in de buurt gebruiken door een volledige tekstzoekopdracht uit te voeren.

Nabijheid zoeken/Termijn

Met deze vorm van zoeken in volledige tekst kunt u zoeken naar woorden of woordgroepen die dicht bij elkaar liggen. Het is erg handig om records te vinden als sommige woorden of zinsdelen erg krap staan.

Voorbeeld

Een goed voorbeeld van zoeken in de buurt is het zoeken naar records waar het woord voetbal is in de buurt van het woord grond om alleen informatie over voetbalvelden te krijgen.

Zoeken naar 'geavanceerd bijna testen' met behulp van Proximity Term

Als u wilt zoeken naar alle artikelen waarin geavanceerd testen wordt genoemd zonder een bepaalde volgorde te volgen, kunt u het beste zoeken op nabijheid, aangezien zoeken in volledige tekst is ingesteld voor de gewenste kolom.

Schrijf het volgende script om te zoeken naar het woord geavanceerd in de buurt van het woord testen in willekeurige volgorde in de kolom Opmerkingen:

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

De resultaten zijn als volgt:

De resultaten lieten ons de opmerkingen zien waar testen wordt genoemd door geavanceerde methoden en dit is waar we naar op zoek waren. We kunnen ook de afstand tussen twee woorden specificeren.

Zoeken met niet meer dan 2 woorden uit elkaar

Voer ten slotte een Full-Text-query uit met behulp van de proximity-term om elk databasescenario te achterhalen waarin het woord database is in de buurt van het woord scenario maar niet meer dan 2 woorden uit elkaar.

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

De uitvoer is als volgt:

Als gevolg hiervan is het artikel waarin database-ontwikkelingsscenario wordt genoemd, is met succes getoond.

Hiermee hebt u met succes geleerd om geavanceerde Full-Text-query's tegen elke kolom te schrijven. Dit helpt u te voldoen aan geavanceerde zoekvereisten, zodat u klaar bent om Full-Text Search uit te voeren in uw professionele levensscenario's, waar van toepassing.

Dingen om te doen

Nu u geavanceerde Full-Text-query's kunt schrijven, moet u de volgende dingen proberen om uw vaardigheden te verbeteren:

  1. Probeer te zoeken naar alle artikelen met het voorvoegsel auto wordt gebruikt.
  2. Houd dit artikel in gedachten en probeer een script te schrijven om op nabijheid te zoeken om alle rijen te vinden waar het woord modern is in de buurt van het woord tools .
  3. Probeer alle verbuigingsvormen van het woord schreef te vinden .

  1. Hoe u SHOW LOCALES uitvoert in MariaDB

  2. Wat is het verschil tussen bindvariabelen en substitutievariabelen (die ik invoer met &&)?

  3. Mysql:Selecteer alle gegevens tussen twee datums

  4. Verbind HP-UX Itanium met SQL Server