跳到主要内容

Analyzer 概述

在文本处理中,Analyzer 是一个关键组件,用于将原始文本转换为结构化、可搜索的格式。每个 Analyzer 通常由两个核心元素组成:分词器过滤器。它们共同将输入文本拆分为 token、对 token 进行处理,并为高效索引和检索做好准备。

在 Zilliz Cloud 中,创建 Collection 并向 Collection Schema 添加 VARCHAR 字段时,可以配置 Analyzer。Analyzer 生成的 token 可用于构建关键词匹配索引,也可以转换为稀疏 Embedding 以支持 Full text search。有关详细信息,请参阅 Full Text SearchText Match

📘说明

使用 Analyzer 可能会影响性能:

  • **Full text search:**对于 Full text search,DataNodeQueryNode 通道的数据消费速度会变慢,因为它们必须等待分词完成。因此,新写入的数据需要更长时间才能用于搜索。

  • **关键词匹配:**对于关键词匹配,索引创建速度也会变慢,因为必须先完成分词才能构建索引。

Analyzer 的构成

Zilliz Cloud 中的 Analyzer 由且仅由一个分词器零个或多个过滤器组成。

  • 分词器:分词器将输入文本拆分为称为 token 的独立单元。根据分词器类型,这些 token 可以是单词或短语。

  • 过滤器:过滤器可用于进一步处理 token,例如将其转换为小写或移除常见词。

📘说明

分词器仅支持 UTF-8 格式。未来版本将支持其他格式。

下图展示了 Analyzer 处理文本的工作流程。

M9uBwhxNthRHjabVCFlchrXMnIf

Analyzer 类型

Zilliz Cloud 提供两类 Analyzer,以满足不同的文本处理需求:

  • 内置 Analyzer:预定义配置,只需少量设置即可处理常见文本任务。内置 Analyzer 无需复杂配置,适合通用搜索场景。

  • 自定义 Analyzer:对于更高级的需求,您可以通过指定分词器以及零个或多个过滤器来定义自己的配置。这种自定义方式特别适合需要精确控制文本处理流程的场景。

📘说明
  • 如果创建 Collection 时省略 Analyzer 配置,Zilliz Cloud 默认使用 standard Analyzer 处理所有文本。有关详细信息,请参阅 Standard

  • 为了获得最佳搜索和 Query 性能,请选择与文本数据语言相匹配的 Analyzer。例如,standard Analyzer 用途广泛,但对于中文、日语或韩语等具有独特语法结构的语言,它可能并非最佳选择。在这种情况下,强烈建议使用 chinese 等特定语言的 Analyzer,或使用专用分词器\(例如 linderaicu\)和过滤器构建自定义 Analyzer,以确保准确分词并获得更好的搜索结果。

内置 Analyzer

Zilliz Cloud 集群中的内置 Analyzer 已预先配置特定的分词器和过滤器,无需自行定义这些组件即可直接使用。每个内置 Analyzer 都是一个模板,包含预设的分词器和过滤器,并提供可选参数用于自定义。

例如,要使用内置的 standard Analyzer,只需将其名称 standard 指定为 type,还可以选择添加该 Analyzer 类型特有的额外配置,例如 stop_words

python
analyzer_params = {
"type": "standard", # Uses the standard built-in analyzer
"stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization
}

要检查 Analyzer 的执行结果,请使用 run_analyzer 方法:

python
# Sample text to analyze
text = "An efficient system relies on a robust analyzer to correctly process text for various applications."

# Run analyzer
result = client.run_analyzer(
text,
analyzer_params
)

输出如下:

sql
['efficient', 'system', 'relies', 'on', 'robust', 'analyzer', 'to', 'correctly', 'process', 'text', 'various', 'applications']

这表明 Analyzer 会过滤停用词 "a""an""for",并返回其余有意义的 token,从而正确完成输入文本的分词。

上述内置 standard Analyzer 的配置等同于使用以下参数设置自定义 Analyzer。其中显式定义了 tokenizerfilter 选项,以实现等效的 Function 行为:

python
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stop",
"stop_words": ["a", "an", "for"]
}
]
}

Zilliz Cloud 提供以下内置 Analyzer,每种 Analyzer 都针对特定的文本处理需求而设计:

  • standard:适用于通用文本处理,采用标准分词和小写过滤。

  • english:针对英语文本进行优化,并支持英语停用词。

  • chinese:专用于处理中文文本,采用适合中文语言结构的分词方式。

自定义 Analyzer

对于更高级的文本处理,Zilliz Cloud 中的自定义 Analyzer 允许您同时指定分词器过滤器,构建定制的文本处理管道。这种配置非常适合需要精确控制的专用场景。

分词器

分词器是自定义 Analyzer 的必需组件,它通过将输入文本拆分为独立单元(即 token)来启动 Analyzer 管道。根据分词器类型,分词过程会遵循特定规则,例如按空格或标点符号拆分。这样可以更精确、独立地处理每个单词或短语。

例如,分词器会将文本 "Vector Database Built for Scale" 转换为多个独立的 token:

plaintext
["Vector", "Database", "Built", "for", "Scale"]

指定分词器的示例

python
analyzer_params = {
"tokenizer": "whitespace",
}

过滤器

过滤器可选组件,用于按需转换或处理分词器生成的 token。例如,对分词结果 ["Vector", "Database", "Built", "for", "Scale"] 应用 lowercase 过滤器后,结果可能如下:

sql
["vector", "database", "built", "for", "scale"]

根据配置需求,自定义 Analyzer 中的过滤器可以是内置过滤器,也可以是自定义过滤器。

  • 内置过滤器:由 Zilliz Cloud 预先配置,只需少量设置。指定过滤器名称即可直接使用。以下过滤器可作为内置过滤器直接使用:

    • lowercase:将文本转换为小写,以支持不区分大小写的匹配。有关详细信息,请参阅 Lowercase

    • asciifolding:将非 ASCII 字符转换为对应的 ASCII 字符,以简化多语言文本处理。有关详细信息,请参阅 ASCII folding

    • alphanumonly:仅保留字母和数字字符,移除其他字符。有关详细信息,请参阅 Alphanumonly

    • cnalphanumonly:移除包含中文字符、英文字母或数字以外任何字符的 token。有关详细信息,请参阅 Cnalphanumonly

    • cncharonly:移除包含任何非中文字符的 token。有关详细信息,请参阅 Cncharonly

    • pinyin:为中文 token 添加拼音形式,以支持基于拼音的中文文本匹配。有关详细信息,请参阅 Pinyin

    使用内置过滤器的示例:

    python
    analyzer_params = {
    "tokenizer": "standard", # Mandatory: Specifies tokenizer
    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase
    }
  • 自定义过滤器:自定义过滤器支持专用配置。您可以选择有效的过滤器类型\(filter.type\),并为该类型添加特定设置。以下过滤器类型支持自定义:

    • stop:通过设置停用词列表\(例如 "stop_words": ["of", "to"]\)移除指定的常见词。有关详细信息,请参阅 Stop

    • length:根据长度条件排除 token,例如设置 token 的最大长度。有关详细信息,请参阅 Length

    • stemmer:将单词还原为词干,以支持更灵活的匹配。有关详细信息,请参阅 Stemmer

    配置自定义过滤器的示例:

    python
    analyzer_params = {
    "tokenizer": "standard", # Mandatory: Specifies tokenizer
    "filter": [
    {
    "type": "stop", # Specifies 'stop' as the filter type
    "stop_words": ["of", "to"], # Customizes stop words for this filter type
    }
    ]
    }

使用示例

在本例中,您将创建一个包含以下字段的 Collection Schema:

  • 一个用于存储 Embedding 的向量字段。

  • 两个用于文本处理的 VARCHAR 字段:

    • 一个字段使用内置 Analyzer。

    • 另一个字段使用自定义 Analyzer。

将这些配置添加到 Collection 前,请先使用 run_analyzer 方法验证每个 Analyzer。

步骤 1:初始化 MilvusClient 并创建 Schema

首先设置 Milvus 客户端并创建一个新的 Schema。

python
from pymilvus import MilvusClient, DataType

# Set up a Milvus client
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT"
token="YOUR_CLUSTER_TOKEN"
)

# Create a new schema
schema = client.create_schema(auto_id=True, enable_dynamic_field=False)

步骤 2:定义并验证 Analyzer 配置

  1. 配置并验证内置 Analyzerenglish

    • **配置:**定义内置英语 Analyzer 的参数。

    • **验证:**使用 run_analyzer 检查该 Analyzer 配置是否生成预期的分词结果。

    python
    # Built-in analyzer configuration for English text processing
    analyzer_params_built_in = {
    "type": "english"
    }
    # Verify built-in analyzer configuration
    sample_text = "Milvus simplifies text analysis for search."
    result = client.run_analyzer(sample_text, analyzer_params_built_in)
    print("Built-in analyzer output:", result)

    # Expected output:
    # Built-in analyzer output: ['milvus', 'simplifi', 'text', 'analysi', 'search']
  2. 配置并验证自定义 Analyzer:

    • **配置:**定义一个自定义 Analyzer,使用标准分词器、内置小写过滤器,以及用于限制 token 长度和移除停用词的自定义过滤器。

    • **验证:**使用 run_analyzer 确认自定义 Analyzer 配置能够按预期处理文本。

    python
    # Custom analyzer configuration with a standard tokenizer and custom filters
    analyzer_params_custom = {
    "tokenizer": "standard",
    "filter": [
    "lowercase", # Built-in filter: convert tokens to lowercase
    {
    "type": "length", # Custom filter: restrict token length
    "max": 40
    },
    {
    "type": "stop", # Custom filter: remove specified stop words
    "stop_words": ["of", "for"]
    }
    ]
    }

    # Verify custom analyzer configuration
    sample_text = "Milvus provides flexible, customizable analyzers for robust text processing."
    result = client.run_analyzer(sample_text, analyzer_params_custom)
    print("Custom analyzer output:", result)

    # Expected output:
    # Custom analyzer output: ['milvus', 'provides', 'flexible', 'customizable', 'analyzers', 'robust', 'text', 'processing']

步骤 3:将 Analyzer 添加到 Schema 字段

验证 Analyzer 配置后,将其添加到 Schema 字段:

python
# Add VARCHAR field 'title_en' using the built-in analyzer configuration
schema.add_field(
field_name='title_en',
datatype=DataType.VARCHAR,
max_length=1000,
enable_analyzer=True,
analyzer_params=analyzer_params_built_in,
enable_match=True,
)

# Add VARCHAR field 'title' using the custom analyzer configuration
schema.add_field(
field_name='title',
datatype=DataType.VARCHAR,
max_length=1000,
enable_analyzer=True,
analyzer_params=analyzer_params_custom,
enable_match=True,
)

# Add a vector field for embeddings
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

# Add a primary key field
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)

步骤 4:准备索引参数并创建 Collection

python
# Set up index parameters for the vector field
index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")

# Create the collection with the defined schema and index parameters
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

在 Zilliz Cloud 控制台中使用

您也可以在 Zilliz Cloud 控制台中执行上述操作。有关详细信息,请播放下面的演示。

📘**说明**

创建 Collection 后,Analyzer 配置不可更改。要更改 Analyzer 配置,请使用所需设置创建新的 Collection,然后迁移数据。

后续步骤

配置 Analyzer 时,建议阅读以下最佳实践文章,以确定最适合您使用场景的配置:

配置 Analyzer 后,您可以将其与 Zilliz Cloud 提供的文本检索功能结合使用。有关详细信息,请参阅:

Ctrl I