跳到主要内容
版本:v3.0.x

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_paramsfilter 部分指定 "pinyin"

Python
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}

这种简写会保留原始中文 token,并输出字符级 Pinyin token。除非你显式启用相应选项,否则不会输出拼接后的 Pinyin 或 Pinyin initials token。

如需完整控制,请将 filter 指定为对象,并配置 Milvus 输出的 Pinyin token 形式。

Python
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_originalBooleantrue在 analyzer 输出中保留原始中文 token。
keep_full_pinyinBooleantrue输出字符级 Pinyin token。例如,中文 会生成 zhongwen
keep_joined_full_pinyinBooleanfalse为每个源 token 输出一个拼接后的 Pinyin token。例如,中文 会生成 zhongwen
keep_separate_first_letterBooleanfalse为每个源 token 输出一个 Pinyin initials token。例如,中文 会生成 zw

filter 会作用于 tokenizer 生成的 token。对于中文文本,请将其与 jieba 等 tokenizer 搭配使用。

Examples

在将 Analyzer 配置应用到 Collection Schema 之前,请先使用 run_analyzer 验证其行为。

Python
from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

sample_text = "中文测试"

使用 character-level Pinyin 匹配中文文本

默认 pinyin filter 会保留原始中文 token,并输出字符级 Pinyin token。

Python
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}

result = client.run_analyzer(sample_text, analyzer_params)
print(result)

预期输出:

Text
['中文', 'zhong', 'wen', '测试', 'ce', 'shi']

Match Chinese terms with joined Pinyin

当你需要让中文词项匹配其完整拼接的 Pinyin 形式时,请启用 keep_joined_full_pinyin

Python
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)

预期输出:

Text
['中文', 'zhongwen', '测试', 'ceshi']

Match Chinese terms with Pinyin initials

当你需要用 Pinyin 形式的首字母匹配中文词时,启用 keep_separate_first_letter

Python
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)

预期输出:

Text
['中文', 'zw', '测试', 'cs']