管理檔案資源
檔案資源是伺服器註冊的外部辭典檔案參考,文字分析器在執行時會使用這個參考。在 Milvus 3.0 中,有四個分析器元件可以從檔案資源載入字典,而不是從內嵌陣列載入:
分析器元件 |
接受檔案資源的參數 |
|---|---|
|
|
|
|
|
|
|
檔案資源解決了內嵌字典陣列的兩個實際問題:
真實的詞典是很大的。一個中文傑巴詞彙可能有數萬行;同義詞表通常有數以千計的規則。將它們內嵌到分析器配置中是不切實際的。
相同的字典通常會在不同的集合中共用。先註冊一次,然後以名稱來參照它,可以讓模式保持在較小的範圍內,並且讓字典更新成為單一的操作。
檔案資源類型
Milvus 支援兩種具有不同管理責任的檔案資源類型:
類型 |
檔案所在位置 |
誰管理檔案 |
適合 |
|---|---|---|---|
遠端 |
在您的 Milvus 叢集已設定使用的物件儲存空間 (MinIO / S3 / GCS / Azure) 中 |
Milvus,透過 |
建議用於大多數部署。 |
本機 |
在每個 Milvus 元件(DataNode、QueryNode、StreamingNode)的本機檔案系統上的相同絕對路徑。 |
您 - 自行掛載檔案,例如透過 Kubernetes 卷冊 |
開放原始碼/自我託管的情境,您偏好在 Milvus 外部管理字典檔案。 |
本頁其餘的內容會介紹這兩種類型,從較常見的遠端類型開始。
先決條件
對於遠端檔案資源,您的 Milvus 部署必須配置物件儲存。大多數的部署已經是這樣了 - 檢查
milvus.yaml的minio:區段 (或相對應的 Helm 圖表值)。請注意bucketName和rootPath值;註冊檔案資源時會用到它們。對於本機檔案資源,您必須能夠以相同的絕對路徑在每個 Milvus pod / 容器上放置檔案。如何做到這一點取決於您的部署(綁定掛載、ConfigMap 支持的卷、init 容器等)。
註冊遠端檔案資源
註冊遠端檔案資源是一個三步驟的工作流程:上傳檔案到物件儲存空間、以選定的名稱在 Milvus註冊它,然後從任何需要它的分析器引用它。
步驟 1.將字典檔案上傳到物件儲存空間
使用您自己的工具 (mc,aws s3 cp,boto3, 或任何 S3 相容的用戶端 ) 將檔案放入 Milvus 設定使用的資料桶。
例如,如果milvus.yaml 包含:
minio:
bucketName: milvus-bucket
rootPath: file
上傳名為chinese_terms.txt 並以rootPath 為前綴的檔案,會將該物件置於s3://milvus-bucket/file/chinese_terms.txt 。
您在步驟 2 中傳給add_file_resource 的path 參數是完整的物件金鑰,包括 rootPath 前綴- 對於上面的範例,path="file/chinese_terms.txt" 。沒有前綴的路徑 (例如,只有"chinese_terms.txt") 會被拒絕,並顯示錯誤file resource path not exist 。
步驟 2.註冊檔案add_file_resource
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.add_file_resource(
name="chinese_terms", # short, unique name you'll reference later
path="file/chinese_terms.txt", # full S3 object key, including the rootPath prefix
)
add_file_resource 同步驗證:只有在 Milvus 確認物件存在於設定的物件儲存空間path 之後,呼叫才會回傳。如果物件遺失,呼叫會產生MilvusException(code=65535, "file resource path not exist") - 先上傳檔案,然後再重試。
該呼叫是惰性的。使用相同的name 和path 來呼叫add_file_resource 兩次不會產生重複。
步驟 3.從分析器引用檔案資源
只要分析器參數接受檔案參考 (extra_dict_file,stop_words_file,word_list_file,synonyms_file),就使用典型的遠端形式:
{
"type": "remote",
"resource_name": "chinese_terms", # must match the name in add_file_resource
"file_name": "chinese_terms.txt", # filename only — Milvus uses this to identify the file inside the resource
}
所有四個分析器參數使用相同的形狀;只有周圍的分析器關鍵不同。有關每個分析器的具體範例,請參閱 Jieba tokenizer、Stop filter、Decompounder filter 及 Synonym filter。
參數名稱是resource_name 和file_name - 不是name 和file 。使用name /file (或"type": "resource" 而非"type": "remote") 會在分析器建立時產生MilvusException ,並帶有類似resource name of remote file ... must be set 的訊息。
列出檔案資源
resources = client.list_file_resources()
for r in resources:
print(r.name, r.path)
# chinese_terms file/chinese_terms.txt
list_file_resources() 返回FileResourceInfo 对象的列表,每个对象都有.name 和.path 属性。空簇返回[] 。沒有每個資源的get ;list_file_resources 是唯一的讀取 API。
移除檔案資源
client.remove_file_resource(name="chinese_terms")
remove_file_resource 是idempotent:為一個不存在的名稱呼叫它會返回None ,而不會升級。
在移除檔案資源之前,請刪除或變更其分析器配置引用它的任何集合。保留檔案資源直到沒有集合依賴它,可以避免資源消失後分析器查詢失敗的風險。
使用本機檔案資源
本機檔案資源直接指向每個 Milvus 元件本機檔案系統上的路徑。沒有add_file_resource 呼叫 - Milvus 不跟蹤本機資源。您自己將檔案放置在每個相關 pod 或容器上的相同絕對路徑,然後透過路徑引用它:
{
"type": "local",
"path": "/var/lib/milvus/dicts/chinese_terms.txt",
}
本地檔案資源僅在您控制 DataNodes、QueryNodes 和 StreamingNodes 檔案系統的部署中有效 - 通常是裸機上的自託管 Milvus 或 Kubernetes 叢集上的自託管 Milvus,您可以在其中新增卷掛載。檔案必須以完全相同的絕對路徑存在於每個元件上;否則,某些節點在載入分析器時會失敗。
檔案會在分析器首次建立時開啟。如果該路徑當時不存在,則分析器的建立會以MilvusException(code=2000, "IOError: No such file or directory") 失敗。
注意事項
叢集範圍內的可用性不是即時的。
add_file_resource返回後,Milvus 會同步檔案到需要它的每個元件。在這個短暫的視窗中,引用資源的集合可能會在尚未同步的節點上建立失敗。典型的解決方法是在幾秒鐘後重試建立呼叫。僅當沒有集合依賴於資源時才移除。在呼叫
remove_file_resource之前,請移除或變更分析器設定引用該資源的任何集合,以避免分析器查詢找不到檔案。list_file_resources()返回name和path- 沒有大小、校驗和、上傳時間或其他元資料。如果需要,請使用自己的命名慣例追蹤字典版本。