🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
  • Home
  • Blog
  • 如何使用字串資料強化您的相似性搜尋應用程式

如何使用字串資料強化您的相似性搜尋應用程式

  • Engineering
August 08, 2022
Xi Ge

Cover 封面

Milvus 2.1 帶來了一些重要的更新,讓使用 Milvus 更加容易。其中之一是支援字串資料類型。目前 Milvus支援的資料類型包括字串、向量、布林值、整數、浮點數等等。

本文將介紹字串資料類型的支援。閱讀並學習您可以用它做什麼以及如何使用它。

跳至:

支援字串資料類型是使用者最期待的功能之一。它既簡化了使用 Milvus 向量資料庫建立應用程式的過程,又加快了相似性搜索和向量查詢的速度,無論您正在開發什麼應用程式,都能在很大程度上提高效率,降低維護成本。

具體而言,Milvus 2.1 支援 VARCHAR 資料類型,可儲存不同長度的字串。有了 VARCHAR 資料類型的支援,您可以

  1. 直接管理字串資料,無需外部關聯資料庫的協助。

VARCHAR 資料類型的支援,讓您在插入資料到 Milvus 時,可以省略將字串轉換成其他資料類型的步驟。假設您正在為自己的線上書店開發一個書籍搜尋系統。您正在創建一個書籍資料集,並希望用書名來識別書籍。在以前的版本中,Milvus 不支援字串資料類型,在插入資料到 MIilvus 之前,您可能需要先將字串(書籍名稱)轉換成書籍 ID,並借助 MySQL 等關係型資料庫。現在,由於支援字串資料類型,您可以簡單地建立一個字串欄位,直接輸入書籍名稱而非其 ID 號碼。

搜尋和查詢過程也同樣方便。假設有一位客戶最喜歡的書是《Hello Milvus》。您想在系統中搜尋類似的書籍,並推薦給客戶。在 Milvus 以前的版本中,系統只會回傳給您書籍的 ID,您需要多走一步,在關聯資料庫中檢查相應的書籍資訊。但在 Milvus 2.1 中,您可以直接獲取書籍名稱,因為您已經創建了一個包含書籍名稱的字串欄位。

一言以蔽之,字串資料類型的支援,讓您省去了求助其他工具來管理字串資料的功夫,大大簡化了開發流程。

  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_0book_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)進行邏輯組合。

集合操作

您可以使用innot in 來實現集合操作,例如A in ["str1", "str2"]

比較兩個字串欄位

您可以使用關係運算符來比較兩個字串欄位的值。這類關係運算符包括==,!=,>,>=,<,<= 。如需詳細資訊,請參閱關聯運算符

請注意,字串欄位只能與其他字串欄位比較,而不能與其他資料類型的欄位比較。例如,VARCHAR 類型的欄位不能與 Boolean 或 integer 類型的欄位比較。

比較欄位與常數值

您可以使用==!= 來驗證欄位的值是否等於常數值。

使用單一範圍篩選欄位

您可以使用>,>=,<,<= 過濾單一範圍的字串欄位,例如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 Started

Like the article? Spread the word

繼續閱讀