【发布时间】:2021-07-23 14:54:55
【问题描述】:
我的 c# 应用程序调用名为 Search 的 sql 存储函数,并传递了一些搜索词。我正在使用 EasyFTS 库,此处提供:https://www.blackbeltcoder.com/Articles/data/easy-full-text-search-queries
所以应用程序传递一个搜索词,存储函数对其进行处理,并返回搜索结果。
我的表值函数如下所示:
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
【问题讨论】:
-
全文搜索不是为部分词设计的,不知道你为什么这么认为。此外,如果您使用内联电视功能
RETURNS TABLE AS RETURN(SELECT ...)而不是多语句功能,它可能会表现得更好
标签: c# tsql asp.net-core-mvc