尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Sql Server 全文索引分词实战:用 TaoToken 统一 Key 打通字段关键词提取配置

Sql Server 全文索引分词实战:用 TaoToken 统一 Key 打通字段关键词提取配置 1. 为什么 Sql Server 自带分词总让人又爱又恨Sql Server 全文索引这套东西属于典型的能用但别指望太多。它内置的断字符Word Breaker对中文的处理逻辑是把一段话按语言习惯切成词或字比如全文搜索可能被切成全文搜索全文搜索这些碎片。你如果做过字段关键词提取大概率遇到过这种尴尬明明想提取数据库优化这个关键词结果索引里躺着数据库优化三个互不相干的词条。但话说回来Sql Server 全文索引也不是一无是处。它最大的优势是零外部依赖——不用装 Elasticsearch不用维护额外的分词服务数据库自己就能把字段内容拆成可检索的词条。对于中小规模数据、对分词精度要求不极端的场景这套方案完全跑得通。我试过在几十万行的商品描述表上做关键词提取配合sys.dm_fts_index_keywords这个系统函数能快速拿到每个字段的高频词条再通过 TaoToken 统一 Key 把词条送去模型做语义归并和关键词筛选整条链路就活了。这篇文章面向的是需要在 Sql Server 字段里做关键词提取的开发者。我会先讲清楚全文索引和断字符的配置骨架给出可复制的config.toml与settings.json示例然后演示怎么通过 TaoToken 的统一 API 通道完成调用与验证。预期目标是跑通一条可复现的字段关键词提取链路从建全文索引到查词条再到调模型做关键词归并最后验证结果。需要提前说明的是Sql Server 自带分词能力确实偏低中文场景下尤其明显。如果你的业务对分词精度要求很高这套方案只能作为轻量级补充不能替代专业分词组件。但如果你只是想快速从字段里捞出候选关键词再借助模型做二次加工那这条路是通的。2. TaoToken 前置统一 Key 与 API 通道准备在动手配 Sql Server 之前先把 TaoToken 这边的通道准备好。TaoToken 的作用是提供一个统一的 Key 和 API 入口让你不用在多个模型服务之间来回切换配置。对于字段关键词提取这个场景我们需要的是模型对话能力——把 Sql Server 捞出来的原始词条丢给模型让它做语义归并、去重、筛选。2.1 获取 API Key先到 TaoToken 控制台创建 API Key。地址是https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。创建时建议给 Key 起个能识别的名字比如sqlserver-keyword-extract方便后续排查。拿到 Key 之后记下两个东西Key 本身以及 API 基础地址https://taotoken.net/api。注意这个地址后面不加 UTM 参数直接用于代码里的 base_url。2.2 确认模型通道字段关键词提取对模型的要求不算高普通对话模型就能胜任。你可以在模型对话页面先手动试一条请求确认 Key 能正常工作。模型对话入口https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。如果你后续要把这套链路接到长期运行的编码或 Agent 流程里可以考虑 Coding Plan入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。不过本篇聚焦的是字段关键词提取先用按量调用的方式跑通即可。2.3 接入文档位置配置过程中如果对参数有疑问接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。建议先扫一眼请求格式后面写settings.json时会用到。3. 可复制配置全文索引 分词组件的骨架这一章是核心操作部分。我会分成两块Sql Server 侧的全文索引配置以及应用侧的config.toml和settings.json。3.1 启动全文索引服务在 Sql Server 配置管理工具里找到SQL Full-text Filter Daemon Launcher服务用本地用户启动。这一步是全文索引能工作的前提服务没起来后面全白搭。3.2 创建全文目录打开目标数据库在存储节点下找到全文目录右键新建。也可以用语句创建CREATE FULLTEXT CATALOG [FD_KeywordExtract] WITH ACCENT_SENSITIVITY ON AS DEFAULT AUTHORIZATION [dbo];如果你需要指定全文目录的磁盘位置用存储过程方式USE [YourDatabase]; GO EXEC [sys].[sp_fulltext_database] action enable; EXEC [sys].[sp_fulltext_catalog] ftcat fulltext_keyword, action create, path ND:\fulltext;path指向全文索引文件的存放目录建议放在独立磁盘上避免和数据库数据文件抢 IO。3.3 创建全文索引右键需要建索引的表选择全文索引进入定义向导。几个关键选择第一唯一非空索引。全文索引必须绑定一个唯一非空索引通常选主键。第二选择需要全文搜索的列并指定断字符语言。中文场景选简体中文。断字符的作用就是决定怎么把长文本拆成词或字。第三跟踪方式选自动跟踪表数据变更时索引会自动填充。第四选择全文目录、索引文件、非索引字表。非索引字表用系统默认的即可它存放的是断字后不参与索引的词比如的了这类。建完之后可以用下面这条语句查看断字结果SELECT TOP 1000 * FROM sys.dm_fts_index_keywords( db_id(YourDatabase), object_id(YourTable) );这条语句返回的就是全文索引里的词条列表包含keyword、display_term、column_id、document_count等字段。document_count表示该词条出现在多少个文档里这个值对关键词提取很有用——出现次数太少的词条可能是噪声太多的可能是停用词。3.4 config.toml 示例应用侧我用一个config.toml来管理数据库连接和 TaoToken 配置[database] host 127.0.0.1 port 1433 user sa password YourPassword database YourDatabase table YourTable keyword_column Description [taotoken] base_url https://taotoken.net/api api_key sk-your-taotoken-key model gpt-4o-mini timeout 30 [extract] top_n 50 min_document_count 2 max_document_count 10000top_n控制从全文索引里取前多少个词条送去模型。min_document_count和max_document_count用来过滤噪声词条和过于常见的停用词。3.5 settings.json 示例settings.json用来配置请求模型时的参数{ temperature: 0.2, max_tokens: 1024, messages_template: [ { role: system, content: 你是一个关键词提取助手。用户会给你一组从 Sql Server 全文索引中提取的原始词条每个词条带有出现文档数。请你完成三件事1. 合并语义相近的词条2. 去掉明显无意义的碎片3. 输出最终的关键词列表按重要性排序。只输出关键词用逗号分隔。 }, { role: user, content: {{keywords}} } ] }temperature设低一点保证输出稳定。messages_template里的{{keywords}}是占位符实际调用时替换成从 Sql Server 查出来的词条列表。4. 验证请求跑通字段关键词提取链路配置就绪后写一个脚本来串起整条链路。我用 Python 演示其他语言逻辑一样。4.1 从 Sql Server 查词条import pyodbc import tomli with open(config.toml, rb) as f: config tomli.load(f) db config[database] conn pyodbc.connect( fDRIVER{{ODBC Driver 18 for SQL Server}}; fSERVER{db[host]},{db[port]}; fDATABASE{db[database]}; fUID{db[user]};PWD{db[password]}; TrustServerCertificateyes; ) cursor conn.cursor() cursor.execute( SELECT keyword, document_count FROM sys.dm_fts_index_keywords( db_id(?), object_id(?) ) WHERE document_count ? AND document_count ? ORDER BY document_count DESC , db[database], db[table], config[extract][min_document_count], config[extract][max_document_count]) rows cursor.fetchall()[:config[extract][top_n]] keywords_raw \n.join( f{row.keyword} ({row.document_count}) for row in rows ) print(keywords_raw)这段代码从sys.dm_fts_index_keywords里捞出词条按文档数排序取前 N 个。输出格式是词条 (文档数)方便模型判断重要性。4.2 调用 TaoToken 做关键词归并import json import requests with open(settings.json, r, encodingutf-8) as f: settings json.load(f) taotoken config[taotoken] messages [] for msg in settings[messages_template]: content msg[content].replace({{keywords}}, keywords_raw) messages.append({role: msg[role], content: content}) resp requests.post( f{taotoken[base_url]}/v1/chat/completions, headers{ Authorization: fBearer {taotoken[api_key]}, Content-Type: application/json }, json{ model: taotoken[model], messages: messages, temperature: settings[temperature], max_tokens: settings[max_tokens] }, timeouttaotoken[timeout] ) result resp.json() final_keywords result[choices][0][message][content] print(final_keywords)4.3 预期结果跑通后你会看到类似这样的输出数据库优化, 索引重建, 查询性能, 执行计划, 慢查询, 锁等待原始词条里可能混着数据库优化索引重建这些碎片模型会把它们归并成数据库优化索引重建这样的完整关键词。这就是整条链路的价值Sql Server 负责粗粒度捞词模型负责语义归并。5. 本篇常见错排查5.1 全文索引服务起不来最常见的原因是SQL Full-text Filter Daemon Launcher服务没启动或者启动账户权限不够。检查服务状态确认用的是本地用户或具有足够权限的账户。如果服务启动后自动停止看 Windows 事件日志里的错误详情。5.2 sys.dm_fts_index_keywords 返回空这个函数返回空通常有两个原因全文索引还没填充完成或者表里没有符合条件的数据。先确认全文索引的填充状态SELECT * FROM sys.fulltext_indexes WHERE object_id object_id(YourTable);看crawl_end_date是否有值。如果没有手动触发一次填充ALTER FULLTEXT INDEX ON YourTable START FULL POPULATION;5.3 中文断字效果差这是 Sql Server 自带分词的固有问题不是配置错误。简体中文断字符会把很多词拆成单字导致sys.dm_fts_index_keywords返回大量单字词条。应对办法是在 SQL 查询里过滤掉长度为 1 的词条WHERE LEN(keyword) 1然后在模型提示词里明确要求合并语义相近的词条。如果对分词精度要求极高建议在应用层引入专业分词组件Sql Server 全文索引只作为候选词来源。5.4 TaoToken 请求返回 401检查config.toml里的api_key是否完整有没有多余空格。确认base_url是https://taotoken.net/api不要在后面加斜杠或其他路径。如果 Key 刚创建稍等几秒再试。5.5 模型输出格式不稳定如果模型返回的不是纯关键词列表而是带了解释文字检查settings.json里的 system prompt 是否足够明确。可以把temperature再调低到 0.1并在 prompt 里加上只输出关键词不要任何解释。6. 继续用 TaoToken 打通你的关键词提取链路整条链路跑通后你会发现 Sql Server 全文索引负责的是捞候选词TaoToken 负责的是把候选词变成可用关键词。两者分工明确各干各擅长的事。如果你在接入过程中遇到 API 报错或配置问题先去 API Keys 页面确认 Key 状态https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。参数细节查接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。想先手动验证模型输出效果用模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。如果这套关键词提取要接到长期运行的编码或 Agent 流程里看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。最后分享一个实用技巧sys.dm_fts_index_keywords返回的document_count字段除了用来排序还可以做趋势分析。定期把词条和文档数快照到一张历史表里对比不同时间段的词条变化能发现字段内容的热点迁移。这个用法比单纯提取关键词更有价值。
返回列表