技术博客
中文分词接口:为站内搜索与问答做中文词条索引

中文分词接口:为站内搜索与问答做中文词条索引

作者: 万维易源
2026-09-01
chinese-segmentation-search-269
# 中文分词接口:为站内搜索与问答做中文词条索引 > 接口:中文分词接口(269-1) · 免费 · POST/GET · JSON · 适用人群:后端、搜索工程师 · 阅读时间:8 分钟 ## 核心要点 - 中文不像英文有空格,直接"整句匹配"会严重漏召回;先分词建立词条索引是中文检索的标配第一步。 - 落地路径:文档/商品标题 → 分词得到 `list` → 建立倒排索引(词条 → 文档ID)→ 查询时同样分词再查。 - 本接口免费,适合中小体量先跑通中文检索原型。 ## Why:为什么中文搜索必须先分词 用户搜"平价防晒",你的文档标题是"高性价比学生防晒霜推荐"。若不做分词、拿整句去匹配,两者字面完全不同,永远搜不到。分词后标题变成 `["高性价比","学生","防晒霜","推荐"]`,查询"平价防晒"分词成 `["平价","防晒"]`,至少"防晒"能命中——召回立刻上来。 ## What:索引构建速览 | 环节 | 做法 | |------|------| | 建库 | 对每篇文档标题/正文调用 269-1,取 `list` | | 倒排 | `词条 -> [文档ID...]` 的映射 | | 查询 | 用户查询词同样分词,取交集/并集召回文档 | | 排序 | 按命中词条数、位置等简单打分 | ## How:最小倒排索引实现 **Python** ```python import urllib.request, urllib.parse, json APP_KEY = "YOUR_APPKEY" def segment(text): url = f"https://route.showapi.com/269-1?appKey={APP_KEY}" data = urllib.parse.urlencode({"text": text}).encode("utf-8") req = urllib.request.Request(url, data=data, headers={"content-type": "application/x-www-form-urlencoded"}) with urllib.request.urlopen(req, timeout=10) as resp: res = json.loads(resp.read().decode("utf-8")) body = res.get("showapi_res_body", {}) return body.get("list", []) if body.get("ret_code") == 0 else [] # 建库 docs = { 1: "高性价比学生防晒霜推荐", 2: "敏感肌补水面膜测评", } inverted = {} for doc_id, title in docs.items(): for w in segment(title): inverted.setdefault(w, []).append(doc_id) # 查询 def search(query): q_words = segment(query) hits = {} for w in q_words: for doc_id in inverted.get(w, []): hits[doc_id] = hits.get(doc_id, 0) + 1 return sorted(hits.items(), key=lambda x: -x[1]) print(search("平价防晒")) # 命中 doc 1(防晒) ``` **cURL** ```bash curl -X POST "https://route.showapi.com/269-1?appKey=YOUR_APPKEY" \ --data-urlencode "text=高性价比学生防晒霜推荐" ``` **Node.js** ```js async function buildInverted(docs) { const inv = {}; for (const [id, title] of Object.entries(docs)) { const res = await fetch(`https://route.showapi.com/269-1?appKey=YOUR_APPKEY`, { method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ text: title }).toString() }).then(r => r.json()); const list = (res.showapi_res_body || {}).list || []; list.forEach(w => (inv[w] = inv[w] || []).push(Number(id))); } return inv; } ``` ## 返回示例与解析 文档标题分词存入倒排索引;查询"平价防晒"分词为 `["平价","防晒"]`,"防晒"命中文档 1,实现跨字面召回。 ## 进阶 / 边界 - 这是"能跑"的最小检索,生产环境建议接 Elasticsearch / OpenSearch 等专业引擎,本接口负责"分词"这一环。 - 同义词、纠错、权重调优是独立工程,不在本接口能力内。 - 免费接口有档位限制,建库批量调用请看[免费档位下的限流与调用策略](https://www.showapi.com/guides/chinese-segmentation-free-tier-269)。 ## FAQ **Q:能直接当搜索引擎用吗?** A:不能。本接口只做分词,索引、排序、高亮需你自己的检索系统完成。 **Q:分词结果能直接进 ES 吗?** A:可以。把 `list` 作为 analyzer 的候选,或先离线分词再写入 ES 的 keyword/text 字段。 **Q:为什么有时召回不准?** A:分词粒度、同义词缺失、索引未覆盖都会导致;分词是召回基础,但不是全部。 **Q:长文档也要整篇分词吗?** A:建议标题+关键字段即可,正文过长看[长文本切分与批量处理](https://www.showapi.com/guides/chinese-segmentation-long-text-269)。 ## 相关能力 / 下一步阅读 - [中文分词接口:如何用分词结果做关键词提取与文本标签](https://www.showapi.com/guides/chinese-segmentation-keyword-extraction-269) - [中文分词接口:免费档位下的限流与调用策略](https://www.showapi.com/guides/chinese-segmentation-free-tier-269) - [中文分词接口:长文本如何切分与批量处理](https://www.showapi.com/guides/chinese-segmentation-long-text-269) - **本系列共 11 篇**:查看[中文分词接口指南总目录](https://www.showapi.com/guides/chinese-segmentation-guides-269)