如何使用字符串数据增强相似性搜索应用程序的功能
封面
Milvus 2.1 有了一些重大更新,使使用 Milvus 变得更加容易。其中之一就是支持字符串数据类型。目前,Milvus支持的数据类型包括字符串、向量、布尔、整数、浮点数等。
本文将介绍对字符串数据类型的支持。请阅读并学习它的功能和使用方法。
跳转到
支持字符串数据类型是用户最期待的功能之一。它既简化了使用 Milvus 向量数据库构建应用程序的过程,又加快了相似性搜索和向量查询的速度,无论您正在开发什么应用程序,都能在很大程度上提高效率,降低维护成本。
具体来说,Milvus 2.1 支持 VARCHAR 数据类型,它可以存储不同长度的字符串。支持 VARCHAR 数据类型后,您可以
- 直接管理字符串数据,而无需借助外部关系数据库。
支持 VARCHAR 数据类型后,在向 Milvus 插入数据时,就可以跳过将字符串转换为其他数据类型的步骤。假设您正在为自己的网上书店开发一个图书搜索系统。您正在创建一个图书数据集,并希望用名称来识别图书。在以前的版本中,Milvus 不支持字符串数据类型,因此在将数据插入 Milvus 之前,您可能需要先借助 MySQL 等关系数据库将字符串(书籍名称)转换为书籍 ID。现在,由于支持字符串数据类型,您只需创建一个字符串字段,然后直接输入图书名称而不是其 ID 编号即可。
搜索和查询过程也同样方便。想象一下,有一个客户最喜欢的书是《Hello Milvus》。您想在系统中搜索类似书籍并推荐给客户。在 Milvus 以前的版本中,系统只会返回图书 ID,您需要多走一步,在关系数据库中查询相应的图书信息。但在 Milvus 2.1 中,您可以直接获取图书名称,因为您已经创建了一个包含图书名称的字符串字段。
总之,对字符串数据类型的支持省去了您求助于其他工具管理字符串数据的精力,大大简化了开发过程。
与其他标量数据类型一样,VARCHAR 也可以在混合搜索和向量查询中通过布尔表达式进行属性过滤。特别值得一提的是,Milvus 2.1 增加了操作符like
,可以执行前缀匹配。此外,还可以使用操作符==
进行精确匹配。
此外,Milvus 2.1 还支持基于 MARISA-trie 的倒排索引,以加速混合搜索和查询。请继续阅读,了解使用字符串数据执行属性筛选时可能需要了解的所有字符串表达式。
现在我们知道字符串数据类型非常有用,但在构建自己的应用程序时,我们究竟什么时候需要使用这种数据类型呢?在下文中,您将看到一些可能涉及字符串数据的场景代码示例,这将让您更好地理解如何在 Milvus 2.1 中管理 VARCHAR 数据。
创建 Collections
让我们继续前面的示例。您仍在开发图书推荐系统,并希望创建一个图书 Collections,其中有一个名为book_name
的主键字段,您将在该字段中插入字符串数据。在这种情况下,您可以在设置字段 Schema 时将数据类型设置为DataType.VARCHAR
,如下例所示。
请注意,在创建 VARCHAR 字段时,必须通过参数max_length
指定最大字符长度,其值范围为 1 至 65,535 之间。 在本例中,我们将最大长度设置为 200。
from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
name="book_id",
dtype=DataType.INT64,
)
book_name = FieldSchema(
name="book_name",
dtype=DataType.VARCHAR,
max_length=200,
is_primary=True,
)
word_count = FieldSchema(
name="word_count",
dtype=DataType.INT64,
)
book_intro = FieldSchema(
name="book_intro",
dtype=DataType.FLOAT_VECTOR,
dim=2
)
schema = CollectionSchema(
fields=[book_id, word_count, book_intro],
description="Test book search"
)
collection_name = "book"
插入数据
现在,Collection 已创建,我们可以向其中插入数据。在下面的示例中,我们插入了 2,000 行随机生成的字符串数据。
import random
data = [
[i for i in range(2000)],
["book_" + str(i) for i in range(2000)],
[i for i in range(10000, 12000)],
[[random.random() for _ in range(2)] for _ in range(2000)],
]
删除数据
假设有两本名为book_0
和book_1
的书在商店中已停售,因此您想从数据库中删除相关信息。在这种情况下,您可以使用术语表达式in
过滤要删除的实体,如下例所示。
请记住,Milvus 只支持删除具有明确指定主键的实体,因此在运行以下代码之前,请确保已将book_name
字段设置为主键字段。
expr = "book_name in [\"book_0\", \"book_1\"]"
from pymilvus import Collection
collection = Collection("book")
collection.delete(expr)
建立索引
Milvus 2.1 支持建立标量索引,这将大大加快过滤字符串字段的速度。与建立向量索引不同,在建立标量索引之前,你不必准备参数。Milvus 暂时只支持字典树(MARISA-trie)索引,因此 VARCHAR 类型字段的索引类型默认为 MARISA-trie。
在建立索引时,可以指定索引名称。如果未指定,index_name
的默认值为"_default_idx_"
。在下面的示例中,我们将索引命名为scalar_index
。
from pymilvus import Collection
collection = Collection("book")
collection.create_index(
field_name="book_name",
index_name="scalar_index",
)
混合搜索
通过指定布尔表达式,可以在向量相似性搜索过程中过滤字符串字段。
例如,如果要搜索简介与《Hello Milvus》最相似的图书,但只想得到名称以 "book_2 "开头的图书,可以使用操作符like
进行前缀匹配,得到目标图书,如下例所示。
search_param = {
"data": [[0.1, 0.2]],
"anns_field": "book_intro",
"param": {"metric_type": "L2", "params": {"nprobe": 10}},
"limit": 2,
"expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)
字符串表达式
除了新添加的操作符like
之外,Milvus 先前版本已经支持的其他操作符也可用于字符串字段过滤。下面是一些常用字符串表达式的示例,其中A
表示 VARCHAR 类型的字段。请记住,下面的所有字符串表达式都可以使用 AND、OR 和 NOT 等逻辑操作符进行逻辑组合。
集合操作符
可以使用in
和not in
实现集合操作,如A in ["str1", "str2"]
。
比较两个字符串字段
您可以使用关系操作符来比较两个字符串字段的值。此类关系操作符包括==
,!=
,>
,>=
,<
,<=
。更多信息,请参阅关系操作符。
请注意,字符串字段只能与其他字符串字段比较,而不能与其他数据类型的字段比较。例如,VARCHAR 类型的字段不能与布尔或整数类型的字段比较。
将字段与常量值进行比较
您可以使用==
或!=
验证字段的值是否等于常量值。
用单一范围过滤字段
可以使用>
,>=
,<
,<=
过滤具有单一范围的字符串字段,如A > "str1"
。
前缀匹配
如前所述,Milvus 2.1 增加了用于前缀匹配的操作符like
,如A like "prefix%"
。
下一步
随着 Milvus 2.1 的正式发布,我们准备了一系列介绍新功能的博客。请阅读本系列博客中的更多内容:
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word