我要求客户有一个搜索字段,他希望在该搜索字段中输入任何文本,并从客户信息表中搜索包含客户信息的多个全文索引列中该文本字段中的每个字。
因此,例如,如果他输入FL Diana Brooks Miami 90210
,则他需要所有这些字词FL
,Diana
,Brooks
,Miami
,{{ 1}})每个被搜索到State,FirstName,LastName,City和Zip列。
现在,这开始似乎是一个坏主意,作为替代方案,我建议使用多个字段分别输入这些信息。尽管如此,我所处的观点是必须从性能角度出示概念证据,说明为什么这不起作用,并且最好有多个字段用于输入术语想要搜索。
所以,进入我的查询,我正在尝试编写一个全文查询来执行客户端要求的内容以获得性能基准。
到目前为止我的功能似乎不起作用,所以我猜 我在问这是否有可能这样做?
90210
我上面的查询似乎有效,但不够限制,只能找到我正在寻找的单个记录,并且返回的内容更多(我猜这是因为我正在使用declare
@zip varchar(10) = 90210
, @lastName varchar(50) = 'Brooks'
, @firstName varchar(50) = 'Diana'
, @city varchar(50) = 'Miami'
, @state char(2) = 'FL'
, @searchTerm varchar(250) = ''
, @s varchar(1) = ' '
set @searchTerm = @state + ' ' + @firstName + ' ' + @lastName + ' ' + @city
select *
from freetexttable(contacts, (zip, lastName, FirstName, city, state), @searchTerm) ftTbl
inner join contacts c on ftTbl.[key] = c.ContactID
)。
我也尝试将其替换为FREETEXTTABLE
,但我收到错误消息:
Msg 7630,Level 15,State 3,Line 26
'Diana'附近的语法错误,全文搜索条件'FL Diana Brooks Miami'。
使用常规索引我已经能够解决这个问题了,但我很好奇是否可以用全文做同样的事情。
使用常规索引我有一个带有适应性WHERE子句的查询,如下所示:
CONTAINSTABLE
答案 0 :(得分:3)
您可以使用WITH SCHEMABINDING
和多个列创建视图id
:
CREATE VIEW dbo.SearchView WITH SCHEMABINDING
AS
SELECT id,
[State]+' ',
[FirstName]+' ',
[LastName]+' ',
[City]+' ',
[Zip] as search_string
FROM YourTable
创建索引
CREATE UNIQUE CLUSTERED INDEX UCI_SearchView ON dbo.SearchView (id ASC)
然后在search_string
字段上创建全文索引。
USE YourDB
GO
--Enable Full-text search on the DB
IF (SELECT DATABASEPROPERTY(DB_NAME(), N'IsFullTextEnabled')) <> 1
EXEC sp_fulltext_database N'enable'
GO
--Create a full-text catalog
IF NOT EXISTS (SELECT * FROM dbo.sysfulltextcatalogs WHERE [name] = N'CatalogName')
EXEC sp_fulltext_catalog N'CatalogName', N'create'
GO
EXEC sp_fulltext_table N'dbo.SearchView', N'create', N'CatalogName', N'IndexName'
GO
--Add a column to catalog
EXEC sp_fulltext_column N'dbo.SearchView', N'search_string', N'add', 0 /* neutral */
GO
--Activate full-text for table/view
EXEC sp_fulltext_table N'dbo.SearchView', N'activate'
GO
--Full-text index update
exec sp_fulltext_catalog 'CatalogName', 'start_full'
GO
之后,您需要编写一些函数来构造搜索条件。 F.e。
FL Diana Brooks Miami 90210
变成了:
"FL*" AND "Diana*" AND "Brooks*" AND "Miami*" AND "90210*"
并在FREETEXT
或CONTAINS
次搜索中使用
DECLARE @search nvarchar(4000) = '"FL*" AND "Diana*" AND "Brooks*" AND "Miami*" AND "90210*"'
SELECT sv.*
FROM dbo.SearchView sv
INNER JOIN CONTAINSTABLE (dbo.SearchView, search_string, @search) as c
ON c.[KEY] = sv.id