ASCII folding
The asciifolding filter converts characters outside the Basic Latin Unicode block (the first 127 ASCII characters) into their ASCII equivalents. For instance, it transforms characters like í to i, making text processing simpler and more consistent, especially for multilingual content.
Configuration
The asciifolding filter is built into Zilliz Cloud. To use it, simply specify its name in the filter section within analyzer_params.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "standard",
"filter": ["asciifolding"],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "standard");
analyzerParams.put("filter", Collections.singletonList("asciifolding"));
analyzerParams := map[string]any{"tokenizer": "standard", "filter": []any{"asciifolding"}}
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "standard",
"filter": ["asciifolding"]
});
nlohmann::json analyzer_params = {
{"tokenizer", "standard"},
{"filter", {"asciifolding"}}
};
const analyzer_params = {
"tokenizer": "standard",
"filter": ["asciifolding"],
};
# restful
analyzerParams='{
"tokenizer": "standard",
"filter": [
"asciifolding"
]
}'
The asciifolding filter operates on the terms generated by the tokenizer, so it must be used in combination with a tokenizer. For a list of tokenizers available in Zilliz Cloud, refer to Standard Tokenizer and its sibling pages.
After defining analyzer_params, you can apply them to a VARCHAR field when defining a collection schema. This allows Zilliz Cloud to process the text in that field using the specified analyzer for efficient tokenization and filtering. For details, refer to Example use.
Examples
Before applying the analyzer configuration to your collection schema, verify its behavior using the run_analyzer method.
Analyzer configuration
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "standard",
"filter": ["asciifolding"],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "standard");
analyzerParams.put("filter", Collections.singletonList("asciifolding"));
analyzerParams := map[string]any{"tokenizer": "standard", "filter": []any{"asciifolding"}}
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "standard",
"filter": ["asciifolding"]
});
nlohmann::json analyzer_params = {
{"tokenizer", "standard"},
{"filter", {"asciifolding"}}
};
const analyzer_params = {
"tokenizer": "standard",
"filter": ["asciifolding"],
};
# restful
analyzerParams='{
"tokenizer": "standard",
"filter": [
"asciifolding"
]
}'
Verification using run_analyzer
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
from pymilvus import (
MilvusClient,
)
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
# Sample text to analyze
sample_text = "Café Möller serves crème brûlée and piñatas."
# Run the standard analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Standard analyzer output:", result)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.ArrayList;
import java.util.List;
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("Café Möller serves crème brûlée and piñatas.");
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
ctx := context.Background()
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{"Café Möller serves crème brûlée and piñatas."}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
for _, r := range result {
for _, token := range r.Tokens {
fmt.Println(token.Text)
}
}
use milvus::v2::prelude::*;
use serde_json::json;
let text = "Café Möller serves crème brûlée and piñatas.";
let response = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts([text])
.analyzer_params(json!({"tokenizer": "standard", "filter": ["asciifolding"]}))
.build()?,
)
.await?;
for result in response.results() {
for token in result.get_tokens() {
println!("{}", token.get_text());
}
}
#include "milvus/MilvusClientV2.h"
#include <iostream>
#include <string>
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 text = "Café Möller serves crème brûlée and piñatas.";
auto request = milvus::RunAnalyzerRequest()
.AddText(text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const sampleText = "Café Möller serves crème brûlée and piñatas.";
const client = new MilvusClient({
address: "YOUR_CLUSTER_ENDPOINT",
});
const result = await client.runAnalyzer({
analyzer_params: analyzer_params,
text: sampleText,
});
# restful
curl -X POST "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
-d '{
"analyzerParams": "{\"tokenizer\": \"standard\", \"filter\": [\"asciifolding\"]}",
"text": ["Café Möller serves crème brûlée and piñatas."]
}'
Expected output
['Cafe', 'Moller', 'serves', 'creme', 'brulee', 'and', 'pinatas']