如何在我的数据库中进行全文搜索
How can I do a full text search in my databse
我的 C# 应用程序调用 sql 名为 Search 的存储函数,并传递一些搜索词。我正在使用 EasyFTS 库,可在此处获得:https://www.blackbeltcoder.com/Articles/data/easy-full-text-search-queries
所以应用程序传递一个搜索词,存储函数处理它,returns 搜索结果。
我的 table 值函数如下所示:
ALTER FUNCTION [dbo].[Search]
(
@locale NVARCHAR(10),
@searchTerm NVARCHAR(450)
)
RETURNS
@retSearch TABLE
(
[Id] INT NOT NULL,
[Table] NVARCHAR(100) NOT NULL,
[Title] NVARCHAR(MAX) NOT NULL,
[Summary] NVARCHAR(MAX) NOT NULL,
[Rank] INT NOT NULL,
[Parameters] NVARCHAR(MAX) NOT NULL,
PRIMARY KEY ([Id],[Table])
)
AS
BEGIN
IF @locale = N''
BEGIN
SET @locale = N'en'
END
INSERT @retSearch
SELECT Id,[Table],[Title],[Summary], RANK [Rank],[Parameters]
FROM dbo.FTSData EP
INNER JOIN
CONTAINSTABLE(dbo.FTSData,Content,
@searchTerm) AS KEY_TBL
ON EP.IdFtsData = KEY_TBL.[KEY]
WHERE EP.LocaleId=@locale
ORDER BY RANK DESC
RETURN
END
问题是搜索结果无法搜索到部分单词。
示例:FORMSOF(INFLECTIONAL, powershe), 将找不到包含单词 powershell 的内容。
我尝试使用 LIKE 并在函数中添加一个新变量,并在搜索值的两边连接 %
SET @searchTermFun = '%'+@searchTerm+'%' 并且适用于数据库端 (SSMS)。
但是当我尝试在我的函数中实现它时它不起作用。是 CONTAINSTABLE 中的问题吗?
测试示例:
DECLARE @SearchTerm AS NVARCHAR(50), @locale AS NVARCHAR(10), @searchTermFun AS NVARCHAR(450)
SET @SearchTerm = 'course'
SET @SearchTermFun = '%'+@SearchTerm+'%'
SET @locale = 'en'
SELECT Id,[Table],[Title],[Summary],[Parameters], LocaleId
FROM dbo.FTSData EP
WHERE EP.LocaleId=@locale AND Content LIKE @SearchTermFun
ORDER by [Table] DESC
找到解决方案,我在我的 .NET Core 应用程序中使用 StringBuilder class 在搜索字符串的末尾添加了一个星号 (*)。它解决了我的问题。
本页有说明:
谢谢大家@Charlieface
我的 C# 应用程序调用 sql 名为 Search 的存储函数,并传递一些搜索词。我正在使用 EasyFTS 库,可在此处获得:https://www.blackbeltcoder.com/Articles/data/easy-full-text-search-queries
所以应用程序传递一个搜索词,存储函数处理它,returns 搜索结果。
我的 table 值函数如下所示:
ALTER FUNCTION [dbo].[Search]
(
@locale NVARCHAR(10),
@searchTerm NVARCHAR(450)
)
RETURNS
@retSearch TABLE
(
[Id] INT NOT NULL,
[Table] NVARCHAR(100) NOT NULL,
[Title] NVARCHAR(MAX) NOT NULL,
[Summary] NVARCHAR(MAX) NOT NULL,
[Rank] INT NOT NULL,
[Parameters] NVARCHAR(MAX) NOT NULL,
PRIMARY KEY ([Id],[Table])
)
AS
BEGIN
IF @locale = N''
BEGIN
SET @locale = N'en'
END
INSERT @retSearch
SELECT Id,[Table],[Title],[Summary], RANK [Rank],[Parameters]
FROM dbo.FTSData EP
INNER JOIN
CONTAINSTABLE(dbo.FTSData,Content,
@searchTerm) AS KEY_TBL
ON EP.IdFtsData = KEY_TBL.[KEY]
WHERE EP.LocaleId=@locale
ORDER BY RANK DESC
RETURN
END
问题是搜索结果无法搜索到部分单词。 示例:FORMSOF(INFLECTIONAL, powershe), 将找不到包含单词 powershell 的内容。
我尝试使用 LIKE 并在函数中添加一个新变量,并在搜索值的两边连接 % SET @searchTermFun = '%'+@searchTerm+'%' 并且适用于数据库端 (SSMS)。 但是当我尝试在我的函数中实现它时它不起作用。是 CONTAINSTABLE 中的问题吗?
测试示例:
DECLARE @SearchTerm AS NVARCHAR(50), @locale AS NVARCHAR(10), @searchTermFun AS NVARCHAR(450)
SET @SearchTerm = 'course'
SET @SearchTermFun = '%'+@SearchTerm+'%'
SET @locale = 'en'
SELECT Id,[Table],[Title],[Summary],[Parameters], LocaleId
FROM dbo.FTSData EP
WHERE EP.LocaleId=@locale AND Content LIKE @SearchTermFun
ORDER by [Table] DESC
找到解决方案,我在我的 .NET Core 应用程序中使用 StringBuilder class 在搜索字符串的末尾添加了一个星号 (*)。它解决了我的问题。
本页有说明:
谢谢大家@Charlieface