Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Implementieren der Volltextsuche in SQL Server 2016 für fortgeschrittene Benutzer

Dieser Artikel beschreibt fortgeschrittene Methoden der Verwendung der Volltextsuche für Datenexperten. Es ermöglicht eine bessere Sucherfahrung in ihrer täglichen Datenbankanalyse.

Darüber hinaus werden den Lesern grundlegende Kenntnisse der Volltextsuche und ihrer Implementierung vermittelt. Sie werden sehen, wie wichtig eine erweiterte Suchmethodik mit Volltextsuche ist, um schnelle und zuverlässige Ergebnisse zu erhalten.

Voraussetzungen

Lassen Sie uns zunächst die Voraussetzungen durchgehen, da sich der Artikel auf die fortgeschrittene Verwendung der Volltextsuche konzentriert.

T-SQL-Know-how

Der Artikel geht davon aus, dass die Leser zum Implementieren der exemplarischen Vorgehensweisen mit dem Schreiben und Ausführen von T-SQL-Skripts für Datenbanken vertraut sind und über grundlegende Kenntnisse von SQL Server verfügen.

Grundlagen der Volltextsuche

Dieser Artikel erwartet außerdem, dass die Leser über ein grundlegendes Verständnis der Volltextsuche verfügen.

Weitere Informationen finden Sie unter Implementieren der Volltextsuche in SQL Server 2016 für Anfänger Artikel, wenn Sie sich mit den grundlegenden Konzepten und der Implementierung der Volltextsuche über Walk-Through(s) vertraut machen möchten.

Installation der Volltextsuche

Nehmen wir an, dass die Volltextsuche bereits zu Ihrer SQL-Instanz hinzugefügt wurde.

Wenn Sie dies noch nicht getan haben, befolgen Sie die Anweisungen im Abschnitt Implementieren der Volltextsuche in SQL Server 2016 für Anfänger Artikel, der Ihnen hilft, die Volltextsuche in Ihrer SQL-Instanz zu installieren.

Sie können den Status der Volltextsuche überprüfen, indem Sie das folgende Skript ausführen:

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

Beispieldatenbank SQLDevBlogV7

Erstellen und füllen Sie nun eine Beispieldatenbank mit dem Namen SQLDevBlogV7 mit Notizen Spalte von VARCHAR(MAX) Typ. Führen Sie dazu das folgende T-SQL-Skript für die Master-Datenbank aus:

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

Volltextkatalog erstellen

Erstellen Sie einen Volltextkatalog mit dem folgenden Skript oder mit dem Einrichtungsassistenten:

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

Volltextindex für Notizen definieren

Sobald der Katalog erfolgreich erstellt wurde, definieren Sie einen Volltextindex basierend auf den Notizen Spalte wie folgt (oder mit dem Einrichtungsassistenten):

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

Volltextkatalog und Volltextindexprüfung

Erweitern Sie zugehörige Knoten, um den gerade erstellten Volltextindex und Volltextkatalog anzuzeigen:

Jetzt können Sie Volltextabfragen für die relevante Tabelle ausführen – in unserem Fall ist es Artikel .

Einfacher Begriff

Die Suche nach einem Wort oder einer Phrase ist einfacher als die Suche nach anderen Formen, daher wird es auch als einfacher Begriff bezeichnet.

Weitere Informationen finden Sie unter Implementieren der Volltextsuche in SQL Server 2016 für Anfänger Artikel, um eine grundlegende Form einer Volltextabfrage zu implementieren, um nach einem Wort oder einer Phrase zu suchen.

Lassen Sie uns nun einige der potenziellen erweiterten Suchen besprechen, die mit der Volltextsuche durchgeführt werden.

Erweiterte Volltextsuche mit Präfixbegriff

Ein Präfixbegriff bezieht sich auf ein vorangestelltes Wort, das mit einigen Buchstaben beginnt – es kann dann alles sein, was diesem Muster entspricht. Sie können es sich als Volltextsuche-Version von LIKE vorstellen mit vorangestelltem Wort*.

Ein Wort oder Wörter innerhalb eines Satzes können auch Präfixbegriffe haben.

Beispiel

Suchen Sie beispielsweise nach dem Wort Daten* kann uns alles liefern, beginnend mit Daten in dieser Spalte, wie z. B. Daten, Datenbank, Datenbanken usw.

Entwicklerbezogene Artikelsuche mit Präfixbegriff

Stellen wir uns vor, Sie haben die Aufgabe, nach entwicklungsbezogenen Artikeln zu suchen, um sie in einer separaten Entwicklungsgruppe zu organisieren, um die Anzeige der Website zu verbessern.

Die Lösung ist die „Präfixbegriffssuche“ mit einer Volltextabfrage wie folgt:

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

Die Ergebnisse zeigte auch der Artikel über DevOps – es ist nicht entwicklungsbezogen, deshalb führen wir ein anderes Skript aus. Es findet alle dev-bezogenen Artikel schneller mit einer Volltextabfrage, mit Ausnahme von DevOps wie folgt:

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

Die Ausgabe sieht wie folgt aus:

Beachten Sie auch, dass das Suchwort unbedingt in doppelte Anführungszeichen gesetzt werden muss, wie in den obigen Skripten gezeigt. Dadurch implementieren wir die Suche nach Präfixbegriffen richtig.

Erweiterte Volltextsuche mit Beugungsform

Manchmal müssen Sie nach Flexionsformen eines Wortes suchen, was bedeutet, dass ein Wort mögliche Formen annehmen kann.

Beispiel

Ein einfaches Beispiel ist das Wort „Deploy“, das die folgenden Flexionsformen haben kann:

  1. Bereitstellung
  2. Bereitgestellt
  3. Bereitstellung
  4. Bereitstellungen
  5. Bereitstellen

Flexionsformen der Schreibsuche

Sehen wir uns an, was passiert, wenn wir eine Volltextabfrage ausführen, um Notizen für alle Flexionsformen des Wortes write: zu finden

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

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

Die Notizenspalte mit Zeilen, die sowohl write enthalten und schreiben werden dort angezeigt, wo schreiben ist eine Flexionsform von schreiben .

Flexible Formen der Technologiesuche

Wenn Sie die Aufgabe haben, alle Artikel zu finden, die unterschiedliche Formen des Technologieworts enthalten, implementieren Sie mithilfe des folgenden T-SQL-Skripts eine gebeugte Form der Wortsuche:

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

Die Ausgabe sieht wie folgt aus:

No Prefix Term Unit Search

Lassen Sie uns nun eine komplexere Volltextabfrage erstellen. Es wird nach allen Artikeln gesucht, um eine Flexionsform des Wortes test zu finden aber ohne vorangestellten Begriff Einheit (ohne Unit-Tests), da wir nach Artikeln über Tests suchen, nicht über Unit-Tests:

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

Infolgedessen werden wir nur Datensätze sehen, bei denen manuell , automatisiert, oder nur testen Wörter werden ohne Einheitentests erwähnt Artikel.

Erweiterte Volltextsuche mit Näherungssuche

Lassen Sie uns unsere praktischen Erfahrungen mit der Näherungssuche nutzen, indem wir eine Volltextabfrage ausführen.

Nähe Suche/Begriff

Mit dieser Form der Volltextsuche können Sie nach Wörtern oder Sätzen suchen, die nahe beieinander liegen. Es ist sehr praktisch, Datensätze zu finden, wenn einige Wörter oder Sätze sehr eng beieinander liegen.

Beispiel

Ein gutes Beispiel für eine Umkreissuche ist die Suche nach Datensätzen mit dem Wort Fußball steht neben dem Wort ground um nur Informationen über Fußballplätze zu erhalten.

Suchen Sie mit dem Begriff „Nähe“ nach „erweiterter Nahtest“

Wenn Sie nach allen Artikeln suchen möchten, in denen erweiterte Tests erwähnt werden, ohne eine bestimmte Reihenfolge einzuhalten, verwenden Sie am besten die Näherungssuche, da die Volltextsuche für die gewünschte Spalte eingerichtet ist.

Schreiben Sie das folgende Skript, um nach dem Wort erweitert zu suchen neben dem Wort testen in beliebiger Reihenfolge in der Spalte Notizen:

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

Die Ergebnisse lauten wie folgt:

Die Ergebnisse zeigten uns die Notizen, in denen das Testen durch fortgeschrittene Methoden erwähnt wird, und genau danach haben wir gesucht. Wir können auch den Abstand zwischen zwei Wörtern angeben.

Suche mit nicht mehr als 2 Wörtern auseinander

Führen Sie abschließend eine Volltextabfrage mit dem Näherungsbegriff aus, um jedes Datenbankszenario herauszufinden, in dem das Wort Datenbank vorkommt steht neben dem Wort Szenario aber nicht mehr als 2 Wörter voneinander entfernt.

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

Die Ausgabe sieht wie folgt aus:

Als Ergebnis wurde der Artikel Datenbankentwicklungsszenario erwähnt wurde erfolgreich gezeigt.

Damit haben Sie erfolgreich gelernt, fortgeschrittene Volltextabfragen für beliebige Spalten zu schreiben. Dies hilft Ihnen, anspruchsvolle Suchanforderungen zu erfüllen, um die Volltextsuche wo immer möglich in Ihren Berufslebensszenarien ausführen zu können.

Dinge zu tun

Da Sie jetzt fortgeschrittene Volltextabfragen schreiben können, sollten Sie Folgendes versuchen, um Ihre Fähigkeiten zu verbessern:

  1. Versuchen Sie, nach allen Artikeln zu suchen, denen das Wort auto vorangestellt ist verwendet wird.
  2. Denken Sie an diesen Artikel und versuchen Sie, ein Skript zu schreiben, um eine Umgebungssuche durchzuführen, um alle Zeilen zu finden, in denen das Wort modern vorkommt steht neben dem Wort Tools .
  3. Versuchen Sie, alle Flexionsformen des Wortes schrieb zu finden .