SQL Server Full Text Search Example
2017/1/43 min read
bookmark this
Example of setup the full-text search on SQL Server
SQL Server full-text search requires installing on SQL Server, after install the full-text search you can setup the index as follows.
How to check Full-Text Search is enable at SQL Server?
If following return 1 means enabled,
0
means is
not.
SELECT FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')
How to get all full text indexed column
select t.name, sc.name
from
sys.fulltext_index_columns ft
inner join sys.columns sc
on sc.[object_id] = ft.[object_id]
and sc.[column_id] = ft.[column_id]
join sys.tables t ON sc.object_id = t.object_id
How to setup index for specific tables
CREATE FULLTEXT CATALOG MyFullTextSearch;
CREATE UNIQUE INDEX MyIndex ON MyTable(TheUniqueKey);
CREATE FULLTEXT INDEX ON MyTable.MyDescriptionColumn
(
MyDescriptionColumn
TYPE COLUMN FileExtension
Language 1033
)
KEY INDEX MyIndex ON MyFullTextSearch
WITH CHANGE_TRACKING AUTO
GO
CREATE FULLTEXT CATALOG MyFullTextSearch;
CREATE UNIQUE INDEX MyIndex ON MyTable(Id);
CREATE FULLTEXT INDEX ON MyTable(MyColumn)
KEY INDEX MyIndex ON MyFullTextSearch
WITH CHANGE_TRACKING AUTO
GO
How to Query data by full text
The following Query will search MyTable
's
MyColumn
for key word Surface Pro
select * from MyTable where FreeText(MyColumn, 'Surface Pro')
If you search for a column is not full-text indexed or SQL Server is not installed full-text feature, you'll see following errors.
select * from MyTable where FreeText(MyColumnNotFullTextIndexed, 'Surface Pro')
Msg 7601, Level 16, State 2, Line 15
Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'MyColumnNotFullTextIndexed' because it is not full-text indexed.
Walk through with Example
Create a table use for test full-text index
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestFullText](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Text] [nvarchar](max) NULL,
[Text2] [nvarchar](max) NULL,
CONSTRAINT [PK_TestFullText] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
SET IDENTITY_INSERT [dbo].[TestFullText] ON
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (1, N'I am your father, boogle', N'I buy')
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (2, N'father boogle', N'he buys')
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (3, N'farther', N'they buy')
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (4, N'Cooking', N'I bought')
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (5, N'cooks', N'I''m buying')
GO
INSERT [dbo].[TestFullText] ([Id], [Text], [Text2]) VALUES (6, N'COOK', NULL)
GO
SET IDENTITY_INSERT [dbo].[TestFullText] OFF
GO
Add Full-Text Index to the Table
Assume we'd like to use Text
and
Text2
columns the o use full-text index, we can add as
following.
CREATE FULLTEXT CATALOG MyTestFullTextTableTextSearch;
CREATE UNIQUE INDEX MyIndex2 ON TestFullText(Id);
CREATE FULLTEXT INDEX ON TestFullText(Text, Text2)
KEY INDEX MyIndex2 ON MyTestFullTextTableTextSearch
WITH CHANGE_TRACKING AUTO
GO
Run Full-Text index query
As you can see, the full-text search for the BUY at the Text2 column will return all the sterming word, such as buy, bought, buys.
select * from TestFullText where Text2 like '%buy%'
select * from TestFullText where FreeText(Text2, 'buy')
select * from TestFullText where Contains(Text2, 'buy')