Pinyin
中文文本搜索通常要求用户输入与索引文本中完全一致的中文字符。在姓名查找、autocomplete 和 search-as-you-type 工作流中,用户经常会输入 Pinyin 而不是中文字符。例如,用户可能会输入 zuqiu 来搜索 足球。pinyin filter 会将 Pinyin token 添加到 analyzer 输出中,使中文文本可以匹配 Pinyin 输入,而无需维护单独的 Pinyin 字段。
pinyin filter 通常与用于中文文本的 Jieba tokenizer 搭配使用。它在自定义 analyzer filter pipeline 中工作,并且可以为同一个中文 token 生成多种 Pinyin token 形式。
Configuration
要使用默认选项,请在 analyzer_params 的 filter 部分指定 "pinyin"。
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
这种简写会保留原始中文 token,并输出字符级 Pinyin token。除非你显式启用相应选项,否则不会输出拼接后的 Pinyin 或 Pinyin initials token。
如需完整控制,请将 filter 指定为对象,并配置 Milvus 输出的 Pinyin token 形式。
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": True,
"keep_joined_full_pinyin": False,
"keep_separate_first_letter": False,
}
],
}
filter 接受以下参数。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
keep_original | Boolean | true | 在 analyzer 输出中保留原始中文 token。 |
keep_full_pinyin | Boolean | true | 输出字符级 Pinyin token。例如,中文 会生成 zhong 和 wen。 |
keep_joined_full_pinyin | Boolean | false | 为每个源 token 输出一个拼接后的 Pinyin token。例如,中文 会生成 zhongwen。 |
keep_separate_first_letter | Boolean | false | 为每个源 token 输出一个 Pinyin initials token。例如,中文 会生成 zw。 |
filter 会作用于 tokenizer 生成的 token。对于中文文本,请将其与 jieba 等 tokenizer 搭配使用。
Examples
在将 Analyzer 配置应用到 Collection Schema 之前,请先使用 run_analyzer 验证其行为。
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
sample_text = "中文测试"
使用 character-level Pinyin 匹配中文文本
默认 pinyin filter 会保留原始中文 token,并输出字符级 Pinyin token。
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
预期输出:
['中文', 'zhong', 'wen', '测试', 'ce', 'shi']
Match Chinese terms with joined Pinyin
当你需要让中文词项匹配其完整拼接的 Pinyin 形式时,请启用 keep_joined_full_pinyin。
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": False,
"keep_joined_full_pinyin": True,
"keep_separate_first_letter": False,
}
],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
预期输出:
['中文', 'zhongwen', '测试', 'ceshi']
Match Chinese terms with Pinyin initials
当你需要用 Pinyin 形式的首字母匹配中文词时,启用 keep_separate_first_letter。
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": False,
"keep_joined_full_pinyin": False,
"keep_separate_first_letter": True,
}
],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
预期输出:
['中文', 'zw', '测试', 'cs']