如何使用字串資料強化您的相似性搜尋應用程式
封面
Milvus 2.1 帶來了一些重要的更新,讓使用 Milvus 更加容易。其中之一是支援字串資料類型。目前 Milvus支援的資料類型包括字串、向量、布林值、整數、浮點數等等。
本文將介紹字串資料類型的支援。閱讀並學習您可以用它做什麼以及如何使用它。
跳至:
支援字串資料類型是使用者最期待的功能之一。它既簡化了使用 Milvus 向量資料庫建立應用程式的過程,又加快了相似性搜索和向量查詢的速度,無論您正在開發什麼應用程式,都能在很大程度上提高效率,降低維護成本。
具體而言,Milvus 2.1 支援 VARCHAR 資料類型,可儲存不同長度的字串。有了 VARCHAR 資料類型的支援,您可以
- 直接管理字串資料,無需外部關聯資料庫的協助。
VARCHAR 資料類型的支援,讓您在插入資料到 Milvus 時,可以省略將字串轉換成其他資料類型的步驟。假設您正在為自己的線上書店開發一個書籍搜尋系統。您正在創建一個書籍資料集,並希望用書名來識別書籍。在以前的版本中,Milvus 不支援字串資料類型,在插入資料到 MIilvus 之前,您可能需要先將字串(書籍名稱)轉換成書籍 ID,並借助 MySQL 等關係型資料庫。現在,由於支援字串資料類型,您可以簡單地建立一個字串欄位,直接輸入書籍名稱而非其 ID 號碼。
搜尋和查詢過程也同樣方便。假設有一位客戶最喜歡的書是《Hello Milvus》。您想在系統中搜尋類似的書籍,並推薦給客戶。在 Milvus 以前的版本中,系統只會回傳給您書籍的 ID,您需要多走一步,在關聯資料庫中檢查相應的書籍資訊。但在 Milvus 2.1 中,您可以直接獲取書籍名稱,因為您已經創建了一個包含書籍名稱的字串欄位。
一言以蔽之,字串資料類型的支援,讓您省去了求助其他工具來管理字串資料的功夫,大大簡化了開發流程。
和其他標量資料類型一樣,VARCHAR 也可以在混合搜尋和向量查詢中透過布林表達式進行屬性篩選。特別值得一提的是,Milvus 2.1 增加了運算符like
,使您能夠執行前綴匹配。您也可以使用運算符==
執行精確匹配。
此外,Milvus 2.1 還支援基於 MARISA-trie 的反向索引,以加速混合搜尋與查詢。繼續閱讀,找出您可能想知道的所有字串表達式,以便使用字串資料執行屬性篩選。
現在我們知道字串資料類型非常有用,但我們在建立自己的應用程式時,到底什麼時候需要使用這種資料類型呢?在下文中,您將看到一些可能涉及到字串資料的場景的程式碼範例,這將讓您更了解如何在 Milvus 2.1 中管理 VARCHAR 資料。
建立一個集合
讓我們依照之前的範例。您仍在進行書籍推薦系統的工作,並想要建立一個書籍集合,其中有一個叫做book_name
的主索引欄位,您會在其中插入字串資料。在這種情況下,您可以在設定欄位模式時將資料類型設定為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"
插入資料
現在集合已建立,我們可以插入資料。在下面的範例中,我們插入 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 類型的欄位不能與 Boolean 或 integer 類型的欄位比較。
比較欄位與常數值
您可以使用==
或!=
來驗證欄位的值是否等於常數值。
使用單一範圍篩選欄位
您可以使用>
,>=
,<
,<=
過濾單一範圍的字串欄位,例如A > "str1"
。
前綴匹配
如前所述,Milvus 2.1 增加了運算符like
用於前綴匹配,如A like "prefix%"
。
下一步
隨著 Milvus 2.1 的正式發行,我們準備了一系列介紹新功能的部落格。閱讀此系列部落格的更多內容:
Like the article? Spread the word