You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2019全文检索(FTS)如何返回含关键词的内容片段?

在SQL Server 2019中实现全文检索并返回关键词片段

要实现你的需求,需要结合**全文检索(FTS)**的高效筛选能力,再通过字符串处理提取包含关键词的片段。以下是具体实现步骤:

1. 确保全文索引正确配置

首先要保证你的表已创建支持波斯语的全文索引,因为波斯语是Unicode语言,需要特定的语言规则支持FTS匹配:

-- 创建全文目录(若不存在)
CREATE FULLTEXT CATALOG ft_PersianContent AS DEFAULT;
GO

-- 假设你的表名为Article,唯一索引为PK_Article_Id,内容字段为Content(NVARCHAR类型)
CREATE FULLTEXT INDEX ON Article(Content LANGUAGE 1065) -- 1065是波斯语的LCID
KEY INDEX PK_Article_Id
ON ft_PersianContent;
GO

2. 编写查询返回关键词片段

使用CONTAINS筛选出匹配的行,再通过CHARINDEX定位关键词位置,结合SUBSTRING截取前后指定长度的内容,同时处理关键词在文本开头/结尾的边界情况:

DECLARE @SearchTerm NVARCHAR(100) = N'زهرا'; -- 替换为你的波斯语搜索关键词
DECLARE @PreLength INT = 50; -- 关键词前截取50字符
DECLARE @PostLength INT = 50; -- 关键词后截取50字符

SELECT
    Id,
    -- 生成带省略号的片段
    CASE
        WHEN CHARINDEX(@SearchTerm, Content) - @PreLength > 0 THEN N'...' + SUBSTRING(Content, CHARINDEX(@SearchTerm, Content) - @PreLength, @PreLength + LEN(@SearchTerm) + @PostLength)
        ELSE SUBSTRING(Content, 1, LEN(@SearchTerm) + @PostLength)
    END +
    CASE
        WHEN CHARINDEX(@SearchTerm, Content) + LEN(@SearchTerm) + @PostLength < LEN(Content) THEN N'...'
        ELSE N''
    END AS SearchFragment
FROM Article
WHERE CONTAINS(Content, @SearchTerm);

关键说明:

  • CHARINDEX:定位关键词在文本中的起始位置,波斯语作为Unicode字符,需确保变量和字段均为NVARCHAR类型。
  • 边界处理:通过CASE判断关键词是否在文本开头/结尾,避免截取超出范围或多余的省略号。
  • 片段长度:调整@PreLength和@PostLength可控制片段总长度(示例中为50+关键词长度+50,约100字符)。

3. 可选:去除CKEditor的HTML标签

如果Content字段存储的是CKEditor生成的HTML内容,可先通过自定义函数去除标签,让片段更干净:

CREATE FUNCTION dbo.RemoveHTMLTags(@HTML NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @StartTag INT, @EndTag INT;
    SET @StartTag = CHARINDEX('<', @HTML);
    WHILE @StartTag > 0
    BEGIN
        SET @EndTag = CHARINDEX('>', @HTML, @StartTag);
        IF @EndTag > 0
            SET @HTML = STUFF(@HTML, @StartTag, @EndTag - @StartTag + 1, '');
        ELSE
            SET @StartTag = 0;
        SET @StartTag = CHARINDEX('<', @HTML);
    END
    RETURN LTRIM(RTRIM(@HTML));
END;
GO

修改查询,先去除HTML再处理片段:

DECLARE @SearchTerm NVARCHAR(100) = N'زهرا';
DECLARE @PreLength INT = 50;
DECLARE @PostLength INT = 50;

SELECT
    Id,
    CASE
        WHEN CHARINDEX(@SearchTerm, CleanContent) - @PreLength > 0 THEN N'...' + SUBSTRING(CleanContent, CHARINDEX(@SearchTerm, CleanContent) - @PreLength, @PreLength + LEN(@SearchTerm) + @PostLength)
        ELSE SUBSTRING(CleanContent, 1, LEN(@SearchTerm) + @PostLength)
    END +
    CASE
        WHEN CHARINDEX(@SearchTerm, CleanContent) + LEN(@SearchTerm) + @PostLength < LEN(CleanContent) THEN N'...'
        ELSE N''
    END AS SearchFragment
FROM (
    SELECT Id, dbo.RemoveHTMLTags(Content) AS CleanContent
    FROM Article
    WHERE CONTAINS(Content, @SearchTerm)
) AS CleanedData;

内容的提问来源于stack exchange,提问作者Zahra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:56:09