Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Implementazione della ricerca full-text in SQL Server 2016 per utenti avanzati

Questo articolo illustra i metodi avanzati di utilizzo della ricerca full-text per i professionisti dei dati. Consente una migliore esperienza di ricerca nell'analisi quotidiana del database.

Inoltre, i lettori andranno oltre la conoscenza di base della ricerca full-text e della sua implementazione. Vedrai l'importanza della metodologia di ricerca avanzata utilizzando la ricerca full-text per ottenere risultati rapidi e affidabili.

Prerequisiti

Innanzitutto, esaminiamo i prerequisiti poiché l'articolo è incentrato sugli usi avanzati della ricerca full-text.

Conoscenza di T-SQL

L'articolo presuppone che per implementare le procedure dettagliate, i lettori abbiano familiarità con la scrittura e l'esecuzione di script T-SQL su database con una conoscenza di base di SQL Server.

Nozioni di base sulla ricerca full-text

Questo articolo prevede inoltre che i lettori abbiano una conoscenza di base della ricerca full-text.

Fare riferimento a Implementazione della ricerca full-text in SQL Server 2016 per principianti articolo se desideri acquisire familiarità con i concetti di base e l'implementazione della ricerca full-text tramite procedure dettagliate.

Installazione della ricerca full-text

Supponiamo che la ricerca full-text sia già stata aggiunta alla tua istanza SQL.

Se non l'hai ancora fatto, segui le istruzioni in Implementazione della ricerca full-text in SQL Server 2016 per principianti articolo per aiutarti a installare la ricerca full-text nella tua istanza SQL.

Puoi controllare lo stato della ricerca full-text eseguendo il seguente script:

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

Database di esempio SQLDevBlogV7

Ora crea e popola un database di esempio chiamato SQLDevBlogV7 avere Note colonna di VARCHAR(MAX) genere. Per farlo, esegui il seguente script T-SQL sul database master:

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

Crea catalogo full-text

Crea un catalogo full-text utilizzando lo script seguente o utilizzando la procedura guidata di configurazione:

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

Definisci l'indice full-text sulle note

Una volta che il catalogo è stato creato correttamente, definisci un indice full-text basato sulle Note colonna come segue (o utilizzando la procedura guidata di configurazione):

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

Catalogo full-text e verifica dell'indice full-text

Espandi i nodi correlati per visualizzare l'indice full-text e il catalogo full-text che hai appena creato:

Ora sei pronto per eseguire query full-text sulla tabella di interesse:nel nostro caso, è Articolo .

Termine semplice

Cercare una parola o una frase è più facile che cercare altre forme, quindi è anche noto come termine semplice.

Fare riferimento a Implementazione della ricerca full-text in SQL Server 2016 per principianti articolo per implementare una forma di base di una query full-text per cercare una parola o una frase.

Ora discutiamo alcune delle potenziali ricerche avanzate effettuate utilizzando la ricerca full-text.

Ricerca full-text avanzata utilizzando il termine prefisso

Un termine prefisso si riferisce a una parola con prefisso che inizia con alcune lettere:può quindi essere qualsiasi cosa che corrisponda a quel modello. Puoi pensarla come una versione di ricerca full-text di MI PIACE con parolaprefissata*.

Una o più parole all'interno di una frase possono anche avere termini prefissi.

Esempio

Ad esempio, cercando la parola dati* può fornirci qualsiasi cosa a partire dai dati in quella colonna come dati, database, database, ecc.

Cerca articoli relativi agli sviluppatori utilizzando il termine prefisso

Immaginiamo che tu abbia il compito di cercare articoli relativi allo sviluppo per organizzarli in un gruppo di sviluppo separato per una migliore esperienza di visualizzazione del sito web.

La soluzione è la "ricerca del termine prefisso" utilizzando una query full-text come segue:

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

I risultati hanno anche mostrato l'articolo su DevOps – non è correlato allo sviluppo, ecco perché eseguiamo un altro script. Troverà più rapidamente tutti gli articoli relativi agli sviluppatori utilizzando una query full-text, escludendo DevOps come segue:

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

L'output è il seguente:

Si noti inoltre che è essenziale mettere la parola da cercare tra virgolette come mostrato negli script sopra. In questo modo, implementiamo correttamente la ricerca del termine prefisso.

Ricerca avanzata di tutto il testo utilizzando il modulo flessivo

A volte è necessario cercare forme flessive di una parola che significano le possibili forme che una parola può assumere.

Esempio

Un semplice esempio è la parola “Deploy” che può avere le seguenti forme flessive:

  1. Distribuisce
  2. Distribuito
  3. Distribuzione
  4. Distribuzioni
  5. Distribuzione in corso

Forme flessive di Write Search

Vediamo cosa succede se eseguiamo una query full-text per trovare le note per tutte le forme flessionali della parola write:

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

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

La colonna Note con righe contenenti entrambi scrivi e scrivere vengono mostrati dove scrittura è una forma flessiva di scrivere .

Forme flessive di ricerca tecnologica

Se hai il compito di trovare tutti gli articoli che contengono forme diverse della parola tecnologica, implementa una forma flessiva della ricerca di parole utilizzando il seguente script T-SQL:

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

L'output è il seguente:

Nessuna ricerca per unità di termini prefisso

Costruiamo ora una query Full-Text più complessa. Cercherà tutti gli articoli per trovare una forma flessiva della parola test ma senza prefisso unità (esclusi i test unitari) poiché stiamo cercando gli articoli sui test, non sui test unitari:

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

Di conseguenza, vedremo solo i record in cui è manuale , automatizzato, o semplicemente test le parole sono menzionate escludendo test unitario articoli.

Ricerca full-text avanzata utilizzando la ricerca di prossimità

Usiamo la nostra esperienza pratica nell'uso della ricerca di prossimità eseguendo una query full-text.

Ricerca/termine di prossimità

Questa forma di ricerca full-text consente di cercare parole o frasi vicine l'una all'altra. È molto utile trovare record quando alcune parole o frasi si trovano molto vicine.

Esempio

Un buon esempio di ricerca di prossimità è la ricerca di record in cui è presente la parola calcio è vicino alla parola terreno per ottenere informazioni solo sui campi di calcio.

Cerca "test vicino avanzato" utilizzando il termine di prossimità

Se desideri cercare tutti gli articoli in cui sono menzionati i test avanzati senza seguire un ordine particolare, l'opzione migliore è utilizzare la ricerca di prossimità, dato che la ricerca full-text è impostata sulla colonna desiderata.

Scrivi il seguente script per cercare la parola avanzata vicino alla parola test in qualsiasi ordine nella colonna Note:

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

I risultati sono i seguenti:

I risultati ci hanno mostrato le note in cui i test sono menzionati con metodi di livello avanzato e questo è quello che stavamo cercando. Possiamo anche specificare la distanza tra due parole.

Ricerca con non più di 2 parole di distanza

Infine, esegui una query full-text utilizzando il termine di prossimità per scoprire ogni scenario di database in cui la parola database è vicino alla parola scenario ma non più di 2 parole di distanza.

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

L'output è il seguente:

Di conseguenza, l'articolo in cui scenario di sviluppo del database è menzionato è stato mostrato correttamente.

Con questo, hai imparato con successo a scrivere query full-text avanzate su qualsiasi colonna. Questo ti aiuta a soddisfare i sofisticati requisiti di ricerca per essere pronto a eseguire la ricerca full-text nei tuoi scenari di vita professionale, ove applicabile.

Cose da fare

Ora che puoi scrivere query full-text avanzate, dovresti provare queste cose per migliorare le tue abilità:

  1. Prova a cercare tutti gli articoli in cui è preceduta la parola auto viene utilizzato.
  2. Tenendo presente questo articolo, prova a scrivere uno script per eseguire la ricerca di prossimità per trovare tutte le righe in cui si trova la parola modern è vicino alla parola strumenti .
  3. Cerca di trovare tutte le forme flessive della parola ha scritto .