中文分词接口:为站内搜索与问答做中文词条索引
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)