Pinyin
中国語テキストの検索では、多くの場合、ユーザーがインデックス付けされたテキストに表示されるとおりに中国語の文字を入力する必要があります。名前検索、オートコンプリート、入力しながら検索するワークフローでは、ユーザーは中国語の文字ではなく Pinyin を入力することがよくあります。たとえば、ユーザーが zuqiu と入力して 足球 を検索する場合があります。pinyin フィルターは、アナライザーの出力に Pinyin トークンを追加するため、別途 Pinyin フィールドを維持しなくても、中国語テキストを Pinyin 入力に一致させることができます。
pinyin フィルターは通常、中国語テキストに対して Jieba トークナイザーと組み合わせて使用します。カスタムアナライザーのフィルターパイプライン内で動作し、同じ中国語トークンに対して複数の Pinyin トークン形式を出力できます。
構成
デフォルトのオプションを使用するには、analyzer_params の filter セクションに "pinyin" を指定します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
analyzerParams.put("filter", Collections.singletonList("pinyin"));
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []string{"pinyin"},
}
use milvus::v2::prelude::*;
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": ["pinyin"]
});
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {"pinyin"}}
};
let analyzer_params = {
tokenizer: "jieba",
filter: ["pinyin"],
};
using System.Collections.Generic;
var analyzerParams = new Dictionary<string, object>
{
["tokenizer"] = "jieba",
["filter"] = new[] { "pinyin" }
};
# restful
analyzerParams='{
"tokenizer": "jieba",
"filter": ["pinyin"]
}'
この省略構文では、元の中国語トークンが保持され、文字レベルの Pinyin トークンが出力されます。これらのオプションを明示的に有効にしない限り、結合された Pinyin や Pinyin の頭文字は出力されません。
フィルターを完全に制御するには、フィルターをオブジェクトとして指定し、Zilliz Cloud が出力する Pinyin トークン形式を構成します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": True,
"keep_joined_full_pinyin": False,
"keep_separate_first_letter": False,
}
],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", true);
pinyinFilter.put("keep_joined_full_pinyin", false);
pinyinFilter.put("keep_separate_first_letter", false);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false,
},
},
}
use milvus::v2::prelude::*;
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false
}
]
});
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", true},
{"keep_joined_full_pinyin", false},
{"keep_separate_first_letter", false}
}
}}
};
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: true,
keep_joined_full_pinyin: false,
keep_separate_first_letter: false,
},
],
};
using System.Collections.Generic;
var analyzerParams = new Dictionary<string, object>
{
["tokenizer"] = "jieba",
["filter"] = new[]
{
new Dictionary<string, object>
{
["type"] = "pinyin",
["keep_original"] = true,
["keep_full_pinyin"] = true,
["keep_joined_full_pinyin"] = false,
["keep_separate_first_letter"] = false
}
}
};
# restful
analyzerParams='{
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false
}
]
}'
フィルターは以下のパラメーターを受け入れます。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
keep_original | Boolean | true | アナライザーの出力に元の中国語トークンを保持します。 |
keep_full_pinyin | Boolean | true | 文字レベルの Pinyin トークンを出力します。たとえば、中文 から zhong と wen が生成されます。 |
keep_joined_full_pinyin | Boolean | false | ソーストークンごとに結合された Pinyin トークンを出力します。たとえば、中文 から zhongwen が生成されます。 |
keep_separate_first_letter | Boolean | false | ソーストークンごとに Pinyin の頭文字トークンを出力します。たとえば、中文 から zw が生成されます。 |
フィルターは、トークナイザーによって生成されたトークンに対して動作します。中国語テキストには、jieba などのトークナイザーと組み合わせて使用してください。
例
アナライザー構成をコレクションスキーマに適用する前に、run_analyzer を使用してその動作を確認してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
from pymilvus import MilvusClient
client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")
sample_text = "中文测试"
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import java.util.*;
ConnectConfig config = ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build();
MilvusClientV2 client = new MilvusClientV2(config);
List<String> texts = new ArrayList<>();
texts.add("中文测试");
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "YOUR_CLUSTER_ENDPOINT",
APIKey: "YOUR_CLUSTER_TOKEN",
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
texts := []string{"中文测试"}
use milvus::v2::prelude::*;
let config = ConnectConfig::new().uri("YOUR_CLUSTER_ENDPOINT").token("YOUR_CLUSTER_TOKEN");
let client = ClientV2::new(&config).await?;
let sample_text = "中文测试";
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
std::string sample_text = "中文测试";
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: "YOUR_CLUSTER_ENDPOINT",
token: "YOUR_CLUSTER_TOKEN",
});
const sample_text = "中文测试";
using Milvus.Client.V2;
using Milvus.Client.V2.Types;
var client = new MilvusClientV2(new ConnectConfig
{
Uri = "YOUR_CLUSTER_ENDPOINT",
ApiKey = "YOUR_CLUSTER_TOKEN"
});
await client.ConnectAsync();
var sampleText = "中文测试";
# restful
# The run_analyzer request is sent directly to the endpoint below.
文字レベルの Pinyin で中国語テキストを一致させる
デフォルトの pinyin フィルターは、元の中国語トークンを保持し、文字レベルの Pinyin トークンを出力します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
analyzerParams.put("filter", Collections.singletonList("pinyin"));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []string{"pinyin"},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": ["pinyin"]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {"pinyin"}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: ["pinyin"],
};
const char_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(char_result.results);
using Milvus.Client.V2;
using Milvus.Client.V2.Requests.Utility;
using Milvus.Client.V2.Responses.Utility;
using Milvus.Client.V2.Types;
var analyzerParams = new Dictionary<string, object>
{
["tokenizer"] = "jieba",
["filter"] = new[] { "pinyin" }
};
RunAnalyzerResp result = await client.RunAnalyzerAsync(new RunAnalyzerReq
{
AnalyzerParams = analyzerParams,
Texts = new[] { sampleText }
});
Console.WriteLine(string.Join(", ", result.Results.SelectMany(r => r.Tokens).Select(t => t.Token)));
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [\"pinyin\"]}"
}'
期待される出力:
['中文', 'zhong', 'wen', '测试', 'ce', 'shi']
結合された Pinyin で中国語の用語を一致させる
中国語の用語を完全な結合 Pinyin 形式に一致させる必要がある場合は、keep_joined_full_pinyin を有効にします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
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)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", false);
pinyinFilter.put("keep_joined_full_pinyin", true);
pinyinFilter.put("keep_separate_first_letter", false);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false,
},
},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false
}
]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", false},
{"keep_joined_full_pinyin", true},
{"keep_separate_first_letter", false}
}
}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: false,
keep_joined_full_pinyin: true,
keep_separate_first_letter: false,
},
],
};
const joined_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(joined_result.results);
using Milvus.Client.V2;
using Milvus.Client.V2.Requests.Utility;
using Milvus.Client.V2.Responses.Utility;
using Milvus.Client.V2.Types;
var analyzerParams = new Dictionary<string, object>
{
["tokenizer"] = "jieba",
["filter"] = new[]
{
new Dictionary<string, object>
{
["type"] = "pinyin",
["keep_original"] = true,
["keep_full_pinyin"] = false,
["keep_joined_full_pinyin"] = true,
["keep_separate_first_letter"] = false
}
}
};
RunAnalyzerResp result = await client.RunAnalyzerAsync(new RunAnalyzerReq
{
AnalyzerParams = analyzerParams,
Texts = new[] { sampleText }
});
Console.WriteLine(string.Join(", ", result.Results.SelectMany(r => r.Tokens).Select(t => t.Token)));
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [{\"type\": \"pinyin\", \"keep_original\": true, \"keep_full_pinyin\": false, \"keep_joined_full_pinyin\": true, \"keep_separate_first_letter\": false}]}"
}'
期待される出力:
['中文', 'zhongwen', '测试', 'ceshi']
Pinyin の頭文字で中国語の用語を一致させる
中国語の用語を Pinyin 形式の頭文字に一致させる必要がある場合は、keep_separate_first_letter を有効にします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
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)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", false);
pinyinFilter.put("keep_joined_full_pinyin", false);
pinyinFilter.put("keep_separate_first_letter", true);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": true,
},
},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": true
}
]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", false},
{"keep_joined_full_pinyin", false},
{"keep_separate_first_letter", true}
}
}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: false,
keep_joined_full_pinyin: false,
keep_separate_first_letter: true,
},
],
};
const initials_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(initials_result.results);
using Milvus.Client.V2;
using Milvus.Client.V2.Requests.Utility;
using Milvus.Client.V2.Responses.Utility;
using Milvus.Client.V2.Types;
var analyzerParams = new Dictionary<string, object>
{
["tokenizer"] = "jieba",
["filter"] = new[]
{
new Dictionary<string, object>
{
["type"] = "pinyin",
["keep_original"] = true,
["keep_full_pinyin"] = false,
["keep_joined_full_pinyin"] = false,
["keep_separate_first_letter"] = true
}
}
};
RunAnalyzerResp result = await client.RunAnalyzerAsync(new RunAnalyzerReq
{
AnalyzerParams = analyzerParams,
Texts = new[] { sampleText }
});
Console.WriteLine(string.Join(", ", result.Results.SelectMany(r => r.Tokens).Select(t => t.Token)));
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [{\"type\": \"pinyin\", \"keep_original\": true, \"keep_full_pinyin\": false, \"keep_joined_full_pinyin\": false, \"keep_separate_first_letter\": true}]}"
}'
期待される出力:
['中文', 'zw', '测试', 'cs']