Milvus(24):全文搜索、文本匹配

1?全文搜索

????????全文搜索是一種在文本數據集中檢索包含特定術語或短語的文檔,然后根據相關性對結果進行排序的功能。該功能克服了語義搜索的局限性(語義搜索可能會忽略精確的術語),確保您獲得最準確且與上下文最相關的結果。此外,它還通過接受原始文本輸入來簡化向量搜索,自動將您的文本數據轉換為稀疏嵌入,而無需手動生成向量嵌入。

????????該功能使用 BM25 算法進行相關性評分,在檢索增強生成 (RAG) 場景中尤為重要,它能優先處理與特定搜索詞密切匹配的文檔。

1.1?概述

????????全文搜索無需手動嵌入,從而簡化了基于文本的搜索過程。該功能通過以下工作流程進行操作符:

  1. 文本輸入:插入原始文本文檔或提供查詢文本,無需手動嵌入。
  2. 文本分析:Milvus 使用分析器將輸入文本標記為可搜索的單個術語。
  3. 函數處理:內置函數接收標記化術語,并將其轉換為稀疏向量表示。
  4. Collections 存儲:Milvus 將這些稀疏嵌入存儲在 Collections 中,以便高效檢索。
  5. BM25 評分:在搜索過程中,Milvus 應用 BM25 算法為存儲的文檔計算分數,并根據與查詢文本的相關性對匹配結果進行排序。

1.2?創建用于全文搜索的 Collections

????????要啟用全文搜索,請創建一個具有特定 Schema 的 Collections。此 Schema 必須包括三個必要字段:

  • 唯一標識 Collections 中每個實體的主字段。
  • 一個VARCHAR?字段,用于存儲原始文本文檔,其enable_analyzer?屬性設置為True?。這允許 Milvus 將文本標記為特定術語,以便進行函數處理。
  • 一個SPARSE_FLOAT_VECTOR?字段,預留用于存儲稀疏嵌入,Milvus 將為VARCHAR?字段自動生成稀疏嵌入。

1.2.1?定義 Collections 模式

????????首先,創建 Schema 并添加必要的字段:

from pymilvus import MilvusClient, DataType, Function, FunctionTypeclient = MilvusClient(uri="http://localhost:19530",token="root:Milvus"
)schema = MilvusClient.create_schema()schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

????????在此配置中

  • id: 作為主鍵,并通過auto_id=True?自動生成。
  • text:存儲原始文本數據,用于全文搜索操作。數據類型必須是VARCHAR?,因為VARCHAR?是 Milvus 用于文本存儲的字符串數據類型。設置enable_analyzer=True?以允許 Milvus 對文本進行標記化。默認情況下,Milvus 使用standard分析器進行文本分析。
  • sparse矢量字段:用于存儲內部生成的稀疏嵌入的矢量字段,以進行全文搜索操作。數據類型必須是SPARSE_FLOAT_VECTOR?。

????????現在,定義一個將文本轉換為稀疏向量表示的函數,然后將其添加到 Schema 中:

bm25_function = Function(name="text_bm25_emb", # 函數名input_field_names=["text"], # 包含原始文本數據的VARCHAR字段的名稱output_field_names=["sparse"], # SPARSE_FLOAT_VECTOR字段的名稱,用于存儲生成的嵌入function_type=FunctionType.BM25, # 設置為“BM25”
)schema.add_function(bm25_function)

參數

說明

name

函數名稱。該函數將text?字段中的原始文本轉換為可搜索向量,這些向量將存儲在sparse?字段中。

input_field_names

需要將文本轉換為稀疏向量的VARCHAR?字段的名稱。對于FunctionType.BM25?,該參數只接受一個字段名稱。

output_field_names

存儲內部生成的稀疏向量的字段名稱。對于FunctionType.BM25?,該參數只接受一個字段名稱。

function_type

要使用的函數類型。將值設為FunctionType.BM25?。

????????對于有多個VARCHAR?字段需要進行文本到稀疏向量轉換的 Collections,請在 Collections Schema 中添加單獨的函數,確保每個函數都有唯一的名稱和output_field_names?值。

1.2.2?配置索引

????????在定義了包含必要字段和內置函數的 Schema 后,請為 Collections 設置索引。為簡化這一過程,請使用AUTOINDEX?作為index_type?,該選項允許 Milvus 根據數據結構選擇和配置最合適的索引類型。

index_params = MilvusClient.prepare_index_params()index_params.add_index(field_name="sparse",index_type="SPARSE_INVERTED_INDEX",metric_type="BM25",params={"inverted_index_algo": "DAAT_MAXSCORE","bm25_k1": 1.2,"bm25_b": 0.75}
)

參數

參數

field_name

要索引的向量字段的名稱。對于全文搜索,這應該是存儲生成的稀疏向量的字段。在本示例中,將值設為sparse?。

index_type

要創建的索引類型。AUTOINDEX?允許 Milvus 自動優化索引設置。如果需要對索引設置進行更多控制,可以從 Milvus 中稀疏向量可用的各種索引類型中進行選擇。

metric_type

該參數的值必須設置為BM25?,專門用于全文搜索功能。

params

特定于索引的附加參數字典。

params.inverted_index_algo

用于構建和查詢索引的算法。有效值:

  • "DAAT_MAXSCORE"?(默認):使用 MaxScore 算法優化的一次文檔 (DAAT) 查詢處理。MaxScore 通過跳過可能影響最小的術語和文檔,為高k值或包含大量術語的查詢提供更好的性能。為此,它根據最大影響分值將術語劃分為基本組和非基本組,并將重點放在對前 k 結果有貢獻的術語上。

  • "DAAT_WAND":使用 WAND 算法優化 DAAT 查詢處理。WAND 算法利用最大影響分數跳過非競爭性文檔,從而評估較少的命中文檔,但每次命中的開銷較高。這使得 WAND 對于k值較小的查詢或較短的查詢更有效,因為在這些情況下跳過更可行。

  • "TAAT_NAIVE":基本術語一次查詢處理(TAAT)。雖然與DAAT_MAXSCORE?和DAAT_WAND?相比速度較慢,但TAAT_NAIVE?具有獨特的優勢。DAAT 算法使用的是緩存的最大影響分數,無論全局 Collections 參數(avgdl)如何變化,這些分數都是靜態的,而TAAT_NAIVE?不同,它能動態地適應這種變化。

params.bm25_k1

控制詞頻飽和度。數值越高,術語頻率在文檔排名中的重要性就越大。取值范圍[1.2, 2.0].

params.bm25_b

控制文檔長度的標準化程度。通常使用 0 到 1 之間的值,默認值為 0.75 左右。值為 1 表示不進行長度歸一化,值為 0 表示完全歸一化。

1.2.3?創建 Collections

????????現在使用定義的 Schema 和索引參數創建 Collections。

client.create_collection(collection_name='my_collection', schema=schema, index_params=index_params
)

1.3?插入文本數據

????????設置好集合和索引后,就可以插入文本數據了。在此過程中,您只需提供原始文本。我們之前定義的內置函數會為每個文本條目自動生成相應的稀疏向量。

client.insert('my_collection', [{'text': 'information retrieval is a field of study.'},{'text': 'information retrieval focuses on finding relevant information in large datasets.'},{'text': 'data mining and information retrieval overlap in research.'},
])

1.4?執行全文搜索

????????將數據插入 Collections 后,就可以使用原始文本查詢執行全文檢索了。Milvus 會自動將您的查詢轉換成稀疏向量,并使用 BM25 算法對匹配的搜索結果進行排序,然后返回 topK (limit) 結果。

search_params = {'params': {'drop_ratio_search': 0.2},
}client.search(collection_name='my_collection', data=['whats the focus of information retrieval?'],anns_field='sparse',limit=3,search_params=search_params
)

參數

說明

search_params

包含搜索參數的字典。

params.drop_ratio_search

搜索過程中要忽略的低重要性詞的比例。

data

原始查詢文本。

anns_field

包含內部生成的稀疏向量的字段名稱。

limit

要返回的最大匹配次數。

2?文本匹配

????????Milvus 的文本匹配功能可根據特定術語精確檢索文檔。該功能主要用于滿足特定條件的過濾搜索,并可結合標量過濾功能來細化查詢結果,允許在符合標量標準的向量內進行相似性搜索。

2.1?概述

????????Milvus 整合了Tantivy來支持其底層的倒排索引和基于術語的文本搜索。對于每個文本條目,Milvus 都會按照以下程序建立索引:

  1. 分析器:分析器將輸入文本標記化為單個詞或標記,然后根據需要應用過濾器。這樣,Milvus 就能根據這些標記建立索引。
  2. 編制索引:文本分析完成后,Milvus 會創建一個倒排索引,將每個獨特的標記映射到包含該標記的文檔。

????????當用戶進行文本匹配時,倒排索引可用于快速檢索包含該術語的所有文檔。這比逐個掃描每個文檔要快得多。

2.2?啟用文本匹配

????????文本匹配適用于VARCHAR?字段類型,它本質上是 Milvus 中的字符串數據類型。要啟用文本匹配,請將enable_analyzer?和enable_match?都設置為True?,然后在定義 Collections Schema 時選擇性地配置分析器進行文本分析。

2.2.1?將enable_analyzer?和enable_match

????????要啟用特定VARCHAR?字段的文本匹配,請在定義字段 Schema 時將enable_analyzer?和enable_match?參數設置為True?。這將指示 Milvus 對文本進行標記化處理,并為指定字段創建反向索引,從而實現快速高效的文本匹配。

from pymilvus import MilvusClient, DataTypeschema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(field_name="id",datatype=DataType.INT64,is_primary=True,auto_id=True
)
schema.add_field(field_name='text', datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True, # 是否為此字段啟用文本分析enable_match=True # 是否啟用文本匹配
)
schema.add_field(field_name="embeddings",datatype=DataType.FLOAT_VECTOR,dim=5
)

2.2.2?可選:配置分析器

????????關鍵詞匹配的性能和準確性取決于所選的分析器。不同的分析器適用于不同的語言和文本結構,因此選擇正確的分析器會極大地影響特定用例的搜索結果。默認情況下,Milvus 使用standard?分析器,該分析器根據空白和標點符號對文本進行標記,刪除長度超過 40 個字符的標記,并將文本轉換為小寫。應用此默認設置無需額外參數。

????????如果需要不同的分析器,可以使用analyzer_params?參數進行配置。例如,應用english?分析器處理英文文本:

analyzer_params = {"type": "english"
}
schema.add_field(field_name='text',datatype=DataType.VARCHAR,max_length=200,enable_analyzer=True,analyzer_params = analyzer_params,enable_match = True,
)

2.3?使用文本匹配

????????為 Collections Schema 中的 VARCHAR 字段啟用文本匹配后,就可以使用TEXT_MATCH?表達式執行文本匹配。

2.3.1?文本匹配表達式語法

? ?TEXT_MATCH?表達式用于指定要搜索的字段和術語。其語法如下:

TEXT_MATCH(field_name, text)
  • field_name:要搜索的 VARCHAR 字段的名稱。
  • text:要搜索的術語。根據語言和配置的分析器,多個術語可以用空格或其他適當的分隔符分隔。

????????默認情況下,TEXT_MATCH?使用OR匹配邏輯,即返回包含任何指定術語的文檔。例如,要搜索text?字段中包含machine?或deep?的文檔,請使用以下表達式:

filter = "TEXT_MATCH(text, 'machine deep')"

????????還可以使用邏輯操作符組合多個TEXT_MATCH?表達式來執行AND匹配。要搜索text?字段中同時包含machine?和deep?的文檔,請使用以下表達式:

filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"

????????要搜索text?字段中同時包含machine?和learning?但不包含deep?的文檔,請使用以下表達式:

filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"

2.3.2?使用文本匹配搜索

????????文本匹配可與向量相似性搜索結合使用,以縮小搜索范圍并提高搜索性能。通過在向量相似性搜索前使用文本匹配過濾 Collections,可以減少需要搜索的文檔數量,從而加快查詢速度。

????????在這個示例中,filter?表達式過濾了搜索結果,使其只包含與指定術語keyword1?或keyword2?匹配的文檔。然后在這個過濾后的文檔子集中執行向量相似性搜索。

# 匹配帶有‘ keyword1 ’或‘ keyword2 ’的實體
filter = "TEXT_MATCH(text, 'keyword1 keyword2')"# 假設‘embeddings’是向量字段,‘text’是VARCHAR字段
result = client.search(collection_name="my_collection", # 集合名稱anns_field="embeddings", # 向量字段名data=[query_vector], # 查詢向量filter=filter,search_params={"params": {"nprobe": 10}},limit=10, # Max。要返回的結果數output_fields=["id", "text"] 
)

2.3.3?文本匹配查詢

????????文本匹配也可用于查詢操作中的標量過濾。通過在query()?方法的expr?參數中指定TEXT_MATCH?表達式,可以檢索與給定術語匹配的文檔。下面的示例檢索了text?字段包含keyword1?和keyword2?這兩個術語的文檔。

# 匹配包含‘ keyword1 ’和‘ keyword2 ’的實體
filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"result = client.query(collection_name="my_collection",filter=filter, output_fields=["id", "text"]
)

2.4?注意事項

????????為字段啟用術語匹配會觸發反向索引的創建,從而消耗存儲資源。在決定是否啟用此功能時,請考慮對存儲的影響,因為它根據文本大小、唯一標記和所使用的分析器而有所不同。

????????在 Schema 中定義分析器后,其設置將永久適用于該 Collections。如果您認為不同的分析器更適合您的需要,您可以考慮刪除現有的 Collections,然后使用所需的分析器配置創建一個新的 Collections。

? ?filter?表達式中的轉義規則:

  • 表達式中用雙引號或單引號括起來的字符被解釋為字符串常量。如果字符串常量包含轉義字符,則必須使用轉義序列來表示轉義字符。例如,用\\?表示\?,用\\t?表示制表符\t?,用\\n?表示換行符。

  • 如果字符串常量由單引號括起來,常量內的單引號應表示為\\'?,而雙引號可表示為"?或\\"?。 示例:'It\\'s milvus'?。

  • 如果字符串常量由雙引號括起來,常量中的雙引號應表示為\\"?,而單引號可表示為'?或\\'?。 示例:"He said \\"Hi\\""?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81477.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2000 元以下罕見的真三色光源投影儀:雷克賽恩Cyber Pro1重新定義入門級投影體驗

當性價比遇上技術瓶頸 在 2000元以下的1080P投影儀,單LCD 技術長期主導。而三色光源的DLP和3LCD真1080P都在4000元以上。 單LCD投影為純白光光源,依賴CF濾光膜導致光效低下,普遍存在" 色彩失真 " 等問題。數據顯示,該價…

Maven 下載安裝與配置教程

## 1. Maven 簡介 Maven 是一個項目管理和構建自動化工具,主要用于 Java 項目。Maven 可以幫助開發者管理項目的構建、報告和文檔,簡化項目依賴管理。 ## 2. 下載 Maven 1. 訪問 Maven 官方網站 [https://maven.apache.org/download.cgi](https://maven.…

C# 深入理解類(從類的外部訪問靜態成員)

從類的外部訪問靜態成員 在前一章中,我們看到使用點運算符可以從類的外部訪問public實例成員。點運算符由實 例名、點和成員名組成。 就像實例成員,靜態成員也可以使用點運算符從類的外部訪問。但因為沒有實例,所以最常 用的訪問靜態成員的方…

Java在微服務架構中的最佳實踐:從設計到部署

在2025年的云計算和分布式系統時代,微服務架構已成為構建高可擴展、高可用系統的標準方法,廣泛應用于電商、金融和物聯網等領域。Java憑借其成熟的生態系統、強大的并發支持和跨平臺能力,是微服務開發的首選語言。例如,我們的訂單…

文件讀取漏洞路徑與防御總結

文件讀取漏洞路徑與防御總結 文件讀取漏洞允許攻擊者通過路徑遍歷等手段訪問未授權的文件。以下是Linux和Windows系統中常見敏感路徑的歸納及防御建議: Linux 系統常見敏感路徑 系統關鍵文件: /etc/passwd:用戶賬戶信息(可被用來…

react-router基本寫法

1. 創建項目并安裝所有依賴 npx create-react-app react-router-pro npm i 2. 安裝所有的 react router 包 npm i react-router-dom 3. 啟動項目 npm run start router/index.js // 創建路由實例 綁定path elementimport Layout from "/pages/Layout"; import…

uni-app 開發HarmonyOS的鴻蒙影視項目分享:從實戰案例到開源后臺

最近,HBuilderX 新版本發布,帶來了令人興奮的消息——uni-app 現在支持 Harmony Next 平臺的 App 開發。這對于開發者來說無疑是一個巨大的福音,意味著使用熟悉的 Vue 3 語法和開發框架,就可以為鴻蒙生態貢獻自己的力量。 前言 作…

純css實現蜂窩效果

<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>蜂窩效果</title><style>body {margin: 0…

JAVA EE_HTTP

為什么意氣風發的少年&#xff0c;總是聽不進去別人的勸解。 ??????? ??????? ----------陳長生. ?主頁&#xff1a;陳長生.-CSDN博客? &#x1f4d5;上一篇&#xff1a;JAVA EE_網絡原理_數據鏈路層-CSDN博客 1.HTTP 1.1.HTTP是什么 H…

存儲扇區分配表:NAND Flash與SD NAND(貼片式SD卡)的架構差異

NAND Flash 和 SD 卡&#xff08;SD NAND&#xff09;的存儲扇區分配表在原理上有相似之處&#xff0c;但由于二者的結構和應用場景不同&#xff0c;也存在一些差異。 相同點&#xff1a; 基本功能&#xff1a;NAND Flash 和 SD 卡&#xff08;SD NAND&#xff09;的存儲扇區分…

界面控件DevExpress WinForms中文教程:Banded Grid View - API

DevExpress WinForms擁有180組件和UI庫&#xff0c;能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用的應用程序&#xff0c;無論是Office風格的界面&#xff0c;還是分析處理大批量的業務數據&#xff0c;它都能輕松勝…

4G物聯網模塊實現廢氣處理全流程數據可視化監控配置

一、項目背景 隨著工業化進程的加速&#xff0c;工業廢氣的排放對環境造成了嚴重影響&#xff0c;廢氣處理廠應運而生。然而&#xff0c;廢氣處理廠中的設備眾多且分散&#xff0c;傳統的人工巡檢和數據記錄方式效率低下&#xff0c;難以及時發現問題。為了實現對廢氣處理設備…

Kubernetes控制平面組件:Kubelet詳解(四):gRPC 與 CRI gRPC實現

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…

【數據結構】線性表--隊列

【數據結構】線性表--隊列 一.什么是隊列二.隊列的實現1.隊列結構定義&#xff1a;2.隊列初始化函數&#xff1a;3.隊列銷毀函數&#xff1a;4.入隊列函數&#xff08;尾插&#xff09;&#xff1a;5.出隊列函數&#xff08;頭刪&#xff09;&#xff1a;6.取隊頭元素&#xff…

C語言—再學習(結構體)

一、建立結構體 用戶自己建立由不同類型數據組成的組合型的數據結構&#xff0c;它稱為結構體。 struct Student { int num; //學號char name[20]; //名字為字符串char sex; //性別int age; //年紀float score; //分數char addr[30]; 地址為字符…

【前端基礎】10、CSS的偽元素(::first-line、::first-letter、::before、::after)【注:極簡描述】

一、偽元素的作用 選取某個特定的元素。 二、::first-line、::first-letter ::first-line&#xff1a;針對首行文本設置屬性 ::first-letter&#xff1a;針對首字母設置屬性 三、::before、::after 在一個元素之前&#xff08;::before&#xff09;或者之后&#xff08;…

系統漏洞掃描服務:維護網絡安全的關鍵與服務原理?

系統漏洞掃描服務是維護網絡安全的關鍵措施&#xff0c;能夠迅速發現系統中的潛在風險&#xff0c;有效預防可能的風險和損失。面對網絡攻擊手段的日益復雜化&#xff0c;這一服務的重要性日益顯著。 服務原理 系統漏洞掃描服務猶如一名恪盡職守的安全守護者。它運用各類掃描…

從 Excel 到 Data.olllo:數據分析師的提效之路

背景&#xff1a;Excel 的能力邊界 對許多數據分析師而言&#xff0c;Excel 是入門數據處理的第一工具。然而&#xff0c;隨著業務數據量的增長&#xff0c;Excel 的一些固有限制逐漸顯現&#xff1a; 操作容易出錯&#xff0c;難以審計&#xff1b; 打開或操作百萬行數據時&…

框架的源碼理解——V3中的ref和reactive

最近在研究各個框架的源碼&#xff0c;從源碼角度去理解 vue3 的 reactive 和 ref API&#xff0c;記錄下研究的成果 reactive 首先&#xff0c;reactive() 的參數必須是一個對象&#xff0c;返回值是一個 Proxy 對象&#xff0c;具有響應性。如果參數不是對象類型&#xff0…

能源數字化轉型關鍵引擎:Profinet轉Modbus TCP網關驅動設備協同升級

在工業自動化的世界中&#xff0c;ModbusTCP和Profinet是兩個非常重要的通訊協議。ModbusTCP以其開放性和易用性&#xff0c;被廣泛應用于各種工業設備中&#xff1b;而Profinet則以其高效性和實時性&#xff0c;成為了眾多高端設備的首選。然而&#xff0c;由于這兩種協議的差…