当前位置: 首页 > java >正文

Milvus(12):分析器

1 分析器概述

        在文本处理中,分析器是将原始文本转换为结构化可搜索格式的关键组件。每个分析器通常由两个核心部件组成:标记器过滤器。它们共同将输入文本转换为标记,完善这些标记,并为高效索引和检索做好准备。

        在 Milvus 中,创建 Collections 时,将VARCHAR 字段添加到 Collections Schema 时,会对分析器进行配置。分析器生成的标记可用于建立关键字匹配索引,或转换为稀疏嵌入以进行全文检索。

        使用分析器可能会影响性能:

  • 全文搜索:对于全文搜索,数据节点查询节点通道消耗数据的速度更慢,因为它们必须等待标记化完成。因此,新输入的数据需要更长的时间才能用于搜索。

  • 关键词匹配:对于关键字匹配,索引创建速度也较慢,因为标记化需要在索引建立之前完成。

1.1 分析器剖析

        Milvus 的分析器由一个标记化器零个或多个过滤器组成。

  • 标记化器:标记器将输入文本分解为称为标记的离散单元。根据标记符类型的不同,这些标记符可以是单词或短语。

  • 过滤器:可以对标记符进行过滤,进一步细化标记符,例如将标记符变成小写或删除常用词。

        标记符仅支持 UTF-8 格式。未来版本将增加对其他格式的支持。下面的工作流程显示了分析器如何处理文本。

1.2 分析器类型

        Milvus 提供两种类型的分析器,以满足不同的文本处理需求:

  • 内置分析器:这些是预定义配置,只需最少的设置即可完成常见的文本处理任务。内置分析器不需要复杂的配置,是通用搜索的理想选择。

  • 自定义分析器:对于更高级的需求,自定义分析器允许你通过指定标记器和零个或多个过滤器来定义自己的配置。这种自定义级别对于需要精确控制文本处理的特殊用例尤其有用。

        如果在创建 Collections 时省略了分析器配置,Milvus 默认使用standard 分析器进行所有文本处理。

1.2.1 内置分析器

        Milvus 中的内置分析器预先配置了特定的标记符号化器和过滤器,使你可以立即使用它们,而无需自己定义这些组件。每个内置分析器都是一个模板,包括预设的标记化器和过滤器,以及用于自定义的可选参数。

        例如,要使用standard 内置分析器,只需将其名称standard 指定为type ,并可选择包含该分析器类型特有的额外配置,如stop_words :

analyzer_params = {"type": "standard", # 使用标准的内置分析器"stop_words": ["a", "an", "for"] # 定义要从标记化中排除的常用单词(停止词)列表
}

        上述standard 内置分析器的配置等同于使用以下参数设置自定义分析器,其中tokenizer 和filter 选项是为实现类似功能而明确定义的:

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

        Milvus 提供以下内置分析器,每个分析器都是为特定文本处理需求而设计的:

  • standard:适用于通用文本处理,应用标准标记化和小写过滤。
  • english:针对英语文本进行了优化,支持英语停止词。
  • chinese:专门用于处理中文文本,包括针对中文语言结构的标记化。

1.2.2 自定义分析器

        对于更高级的文本处理,Milvus 中的自定义分析器允许您通过指定标记化器过滤器来构建定制的文本处理管道。这种设置非常适合需要精确控制的特殊用例。

        标记化器是自定义分析器的必备组件,它通过将输入文本分解为离散单元或标记来启动分析器管道。标记化遵循特定的规则,例如根据标记化器的类型用空白或标点符号分割。这一过程可以更精确、更独立地处理每个单词或短语。

        例如,标记化器会将文本"Vector Database Built for Scale" 转换为单独的标记:

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

        指定标记符的示例: 

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

        过滤器可选组件,用于处理标记化器生成的标记,并根据需要对其进行转换或细化。例如,在对标记化术语["Vector", "Database", "Built", "for", "Scale"] 应用lowercase 过滤器后,结果可能是:

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

        自定义分析器中的过滤器可以是内置的,也可以是自定义的,具体取决于配置需求。

  • 内置过滤器:由 Milvus 预先配置,只需最少的设置。您只需指定过滤器的名称,就能立即使用这些过滤器。以下是可直接使用的内置过滤器:

    • lowercase:将文本转换为小写,确保不区分大小写进行匹配。

    • asciifolding:将非 ASCII 字符转换为 ASCII 对应字符,简化多语言文本处理。

    • alphanumonly:只保留字母数字字符,删除其他字符。

    • cnalphanumonly:删除包含除汉字、英文字母或数字以外的任何字符的标记。

    • cncharonly:删除包含任何非汉字的标记。

        使用内置过滤器的示例:

analyzer_params = {"tokenizer": "standard", # 必选:指定标记器"filter": ["lowercase"], # 可选:内置过滤器,将文本转换为小写
}

        自定义过滤器:自定义过滤器允许进行专门配置。您可以通过选择有效的过滤器类型 (filter.type) 并为每种过滤器类型添加特定设置来定义自定义过滤器。支持自定义的过滤器类型示例:

  • stop:通过设置停止词列表(如"stop_words": ["of", "to"] )删除指定的常用词。

  • length:根据长度标准(如设置最大标记长度)排除标记。

  • stemmer:将单词还原为词根形式,以便更灵活地进行匹配。

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

analyzer_params = {"tokenizer": "standard", # 必选:指定标记器"filter": [{"type": "stop", # 指定‘stop’作为过滤器类型"stop_words": ["of", "to"], # 指定‘stop’作为过滤器类型}]
}

1.3 使用示例

        在本示例中,您将创建一个 Collections Schema,其中包括:

  • 一个用于嵌入的向量字段。

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

    • 一个字段使用内置分析器。

    • 其他使用自定义分析器。

1.3.1 初始化 MilvusClient 并创建 Schema

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

from pymilvus import MilvusClient, DataType# 设置一个Milvus客户端
client = MilvusClient(uri="http://localhost:19530")# 创建一个新模式
schema = client.create_schema(auto_id=True, enable_dynamic_field=False)

1.3.2 定义和验证分析仪配置

        配置并验证内置分析器(english)定义内置英文分析器的分析器参数。

# 内置分析器配置,用于英文文本处理
analyzer_params_built_in = {"type": "english"
}

        配置并验证自定义分析器:定义自定义分析器,该分析器使用标准标记符号生成器、内置小写过滤器以及标记符号长度和停用词自定义过滤器。

# 自定义分析器配置与标准标记器和自定义过滤器
analyzer_params_custom = {"tokenizer": "standard","filter": ["lowercase",  # 内置过滤器:将令牌转换为小写{"type": "length",  # 自定义过滤器:限制令牌长度"max": 40},{"type": "stop",  # 自定义过滤:删除指定的停止词"stop_words": ["of", "for"]}]
}

1.3.3 向 Schema 添加字段

        在验证了分析器配置后,请将其添加到 Schema 字段中:

# 使用内置分析器配置添加VARCHAR字段‘title_en’
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,
)# 使用自定义分析器配置添加VARCHAR字段“title”
schema.add_field(field_name='title',datatype=DataType.VARCHAR,max_length=1000,enable_analyzer=True,analyzer_params=analyzer_params_custom,enable_match=True,
)# 为嵌入添加矢量场
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)# 添加主键字段
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)

1.3.4 准备索引参数并创建 Collections

# 为矢量场设置索引参数
index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")# 使用已定义的模式和索引参数创建集合
client.create_collection(collection_name="my_collection",schema=schema,index_params=index_params
)

2 内置分析器

2.1 标准

   standard 分析器是 Milvus 的默认分析器,如果没有指定分析器,它将自动应用于文本字段。它使用基于语法的标记化,对大多数语言都很有效。

2.1.1 定义

   standard 分析器包括

  • 标记化器:使用standard 标记符号化器,根据语法规则将文本分割成离散的单词单位。
  • 过滤器:使用lowercase 过滤器将所有标记转换为小写,从而实现不区分大小写的搜索。

   standard 分析器的功能相当于以下自定义分析器配置:

analyzer_params = {"tokenizer": "standard","filter": ["lowercase"]
}

2.1.2 配置

        要将standard 分析器应用到一个字段,只需在analyzer_params 中将type 设置为standard ,并根据需要加入可选参数即可。

analyzer_params = {"type": "standard", # 指定标准分析器类型
}

   standard 分析器接受以下可选参数:

参数

说明

stop_words

一个数组,包含将从标记化中删除的停用词列表。默认为_english_ ,这是一组内置的常用英语停止词。

        自定义停止词配置示例:

analyzer_params = {"type": "standard", # 指定标准分析器类型"stop_words", ["of"] # 可选:要从标记化中排除的单词列表
analyzerParams = map[string]any{"type": "standard", "stop_words": []string{"of"}}

        定义analyzer_params 后,您可以在定义 Collections Schema 时将其应用到VARCHAR 字段。这样,Milvus 就能使用指定的分析器处理该字段中的文本,从而实现高效的标记化和过滤。

2.1.3 示例

        分析器配置

analyzer_params = {"type": "standard",  # 标准分析仪配置"stop_words": ["for"] # 可选:自定义停止词参数
}

        预期输出

Standard analyzer output: ['the', 'milvus', 'vector', 'database', 'is', 'built', 'scale']

2.2 英语

        Milvus 中的english 分析器旨在处理英文文本,应用特定语言规则进行标记化和过滤。

2.2.1 定义

   english 分析器使用以下组件:

  • 标记化器:使用standard 标记化器将文本分割成离散的单词单位。

  • 过滤器:包括多个过滤器,用于全面处理文本:

    • lowercase:将所有标记转换为小写,从而实现不区分大小写的搜索。

    • stemmer:将单词还原为词根形式,以支持更广泛的匹配(例如,"running "变为 "run")。

    • stop_words:删除常见的英文停止词,以便集中搜索文本中的关键词语。

   english 分析器的功能相当于以下自定义分析器配置:

analyzer_params = {"tokenizer": "standard","filter": ["lowercase",{"type": "stemmer","language": "english"}, {"type": "stop","stop_words": "_english_"}]
}

2.2.2 配置

        要将english 分析器应用到一个字段,只需在analyzer_params 中将type 设置为english ,并根据需要加入可选参数即可。

analyzer_params = {"type": "english",
}

   english 分析器接受以下可选参数:

参数

说明

stop_words

一个数组,包含将从标记化中删除的停用词列表。默认为_english_ ,这是一组内置的常用英语停止词。

        自定义停止词配置示例:

analyzer_params = {"type": "english","stop_words": ["a", "an", "the"]
}

        定义analyzer_params 后,您可以在定义 Collections Schema 时将其应用到VARCHAR 字段。这样,Milvus 就能使用指定的分析器处理该字段中的文本,以实现高效的标记化和过滤。

2.2.3 示例

        分析器配置

analyzer_params = {"type": "english","stop_words": ["a", "an", "the"]
}

        预期输出

English analyzer output: ['milvus', 'vector', 'databas', 'built', 'scale']

2.3 中文

    chinese 分析器专为处理中文文本而设计,提供有效的分段和标记化功能。

2.3.1 定义

   chinese 分析器包括

  • 标记化器:使用jieba 标记化器,根据词汇和上下文将中文文本分割成标记。
  • 过滤器:使用cnalphanumonly 过滤器删除包含任何非汉字的标记。

   chinese 分析器的功能相当于以下自定义分析器配置:

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

2.3.2 配置

        要将chinese 分析器应用到一个字段,只需在analyzer_params 中将type 设置为chinese 即可。chinese 分析器不接受任何可选参数。

analyzer_params = {"type": "chinese",
}

2.3.3 示例

        分析器配置

analyzer_params = {"type": "chinese",
}

        预期输出

Chinese analyzer output: ['Milvus', '是', '一个', '高性', '性能', '高性能', '可', '扩展', '的', '向量', '数据', '据库', '数据库']
http://www.xdnf.cn/news/3636.html

相关文章:

  • 虚拟机软件详解
  • AI日报 · 2025年5月03日|Perplexity 集成 WhatsApp,苹果传与 Anthropic 合作开发 Xcode
  • 青少年编程与数学 02-018 C++数据结构与算法 24课题、密码学算法
  • 【C#】一个类中的接口方法使用static和不使用static的区别
  • aidermacs开源程序使用 Aider 在 Emacs 中进行 AI 配对编程
  • 使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字
  • 自定义Dockerfile,发布springboot项目
  • Mysql进阶篇1_存储引擎、索引、SQL性能分析指令
  • 基于Jenkins的DevOps工程实践之Jenkins共享库
  • AVIOContext 再学习
  • Spring 容器相关的核心注解​
  • 19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?
  • Linux电源管理(5)_Hibernate和Sleep功能介绍
  • ElasticSearch深入解析(九):Object、Nested、Flattened类型
  • 【RabbitMQ】 RabbitMQ快速上手
  • Python 函数装饰器和闭包(使用装饰器改进“策略”模式)
  • 玩转Docker | 使用Docker部署AI证件照工具
  • 【2025】ORM框架是什么?有哪些常用?Mybatis和Hibernate是什么样的?
  • ES6/ES11知识点
  • wpf CommandParameter 传递MouseWheelEventArgs参数 ,用 MvvmLight 实现
  • Word域操作记录(从1开始的毕业论文格式排版)
  • 神经网络的基本概念与深度解析——基于生物机制的仿生建模与工程实现
  • Spring Boot的GraalVM支持:构建低资源消耗微服务
  • Kubernetes(k8s)学习笔记(四)--入门基本操作
  • 双指针(5)——有效三角形个数
  • 杭电oj(1180、1181)题解
  • “淘宝闪购”提前4天全量,意味着什么?
  • 传奇各职业/战士/法师/道士/手套/手镯/护腕/神秘腰带爆率及出处产出地/圣战/法神/天尊/祈祷/虹魔/魔血
  • Demo02_基于寄存器+标准库开发的项目
  • 传奇各职业/战士/法师/道士/戒指爆率及出处产出地/圣战/法神/天尊/虹魔/魔血/麻痹/超负载/求婚/隐身/传送/复活/护身/祈祷/火焰