短語匹配Compatible with Milvus 2.5.17+
短語匹配可讓您搜尋包含完全相同的查詢字詞的文件。預設情況下,字詞必須以相同的順序出現,並且彼此直接相鄰。例如,查詢「機器人機器學習」會匹配類似「...典型的機器人機器學習模型...」的文字,其中「 機 器人」、 「 機器」和「學習」依序出現,而它們之間沒有其他字詞。
然而,在現實世界的情境中,嚴格的詞組匹配可能會過於僵化。您可能想要匹配類似「...機器人學習模型在機器人學中廣泛採用...」的文字。在這種情況下,相同的關鍵字會出現,但不是並排或以原本的順序出現。為了處理這種情況,短語匹配支援slop 參數,引入了靈活性。slop 的值定義了詞組中詞彙之間允許多少位置轉換。例如,slop 為 1 時,"machine learning「(機器 學習)的查詢可以匹配類似」...machine deep learning...「(機器深度學習...)的文字,其中一個字(」deep")分隔原始詞彙。
概述
短語匹配由Tantivy搜尋引擎函式庫提供,透過分析字詞在文件中的位置資訊來運作。下圖說明流程:
短語匹配工作流程
文件標記化:當您插入文件到 Milvus 時,文本會使用分析器分割成標記(單個單詞或術語),並記錄每個標記的位置資訊。例如,doc_1被標記為["machine" (pos=0), "learning" (pos=1), "boosts" (pos=2), "efficiency" (pos=3)] 。有關分析器的詳細資訊,請參閱分析器概述。
反向索引建立:Milvus 會建立反向索引,將每個符記映射到它出現的文件,以及符記在這些文件中的位置。
詞組匹配:當執行詞組查詢時,Milvus 在倒排索引中查找每個標記,並檢查它們的位置,以確定它們是否以正確的順序和相近程度出現。
slop參數控制匹配標記之間允許的最大位置數目:slop = 0表示符號必須以完全相同的順序出現,並且緊鄰(即中間沒有額外的字)。
- 在範例中,只有doc_1("machine 「在pos=0,」learning "在pos=1)完全符合。
slop = 2允許匹配字元之間最多兩個位置的彈性或重新排列。
這允許顛倒順序 (「學習機器」) 或在字元間留一小段空隙。
因此,doc_ 1、doc_2("learning 「在位置=0,」machine 「在位置=1) 及doc_3(」learning 「在位置=1, 」machine "在位置= 2) 全部匹配。
啟用短語匹配
短語匹配適用於VARCHAR 欄位類型,也就是 Milvus 的字串資料類型。要啟用詞組匹配,請設定您的集合模式,將enable_analyzer 和enable_match 參數都設定為True ,類似於文字匹配。
設定enable_analyzer 和enable_match
要啟用特定VARCHAR 欄位的短語匹配,在定義欄位模式時,將enable_analyzer 和enable_match 參數都設定為True 。此設定指示 Milvus 將文字標記化,並建立一個具有位置資訊的反向索引,以進行有效的短語匹配。
以下是啟用短語匹配的模式定義範例:
from pymilvus import MilvusClient, DataType
# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name="embeddings",
datatype=DataType.FLOAT_VECTOR,
dim=5
)
可選:配置分析器
詞組匹配的準確性在很大程度上取決於用來標記文本資料的分析器。不同的分析器適合不同的語言和文字格式,會影響標記化和定位的精確度。針對您的特定使用情況選擇適當的分析器,將可優化您的詞組匹配結果。
預設情況下,Milvus 使用標準分析器,根據空白和標點符號來標記文字,移除長於 40 個字元的標記,並將文字轉換為小寫。預設用法不需要額外參數。有關詳細資訊,請參閱標準分析器。
如果您的應用程式需要特定的分析器,請使用analyzer_params 參數進行設定。例如,以下是如何設定english 分析器,用於英文文本中的短語匹配:
# Define analyzer parameters for English-language tokenization
analyzer_params = {
"type": "english"
}
# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis
analyzer_params=analyzer_params, # Specifies the analyzer configuration
enable_match=True # Enables inverted indexing for phrase matching
)
Milvus 支援多種針對不同語言和使用情況的分析器。如需詳細資訊,請參閱分析器概述。
使用短語匹配
一旦您在收集模式中啟用了VARCHAR 欄位的匹配,您就可以使用PHRASE_MATCH 表達式執行短語匹配。
PHRASE_MATCH 表達式不區分大小寫。您可以使用PHRASE_MATCH 或phrase_match 。
PHRASE_MATCH 表達式語法
搜尋時,使用PHRASE_MATCH 表達式指定欄位、詞組和可選的彈性 (slop)。語法為
PHRASE_MATCH(field_name, phrase, slop)
field_name:執行短語匹配的VARCHAR欄位名稱。phrase:要搜尋的精確短語。slop(可選):一個整數,指定允許匹配字元的最大位置數。0(預設):僅匹配精確短語。範例:"machine learning 「過濾器會完全匹配」machine learning「,但不會匹配」machine boosts learning 「或」learning machine"。1:允許輕微的變更,例如一個額外的詞彙或位置的輕微移動。例如:機器學習 「篩選條件會匹配」machine boosts learning"("machine 「和」learning 「之間有一個符號),但不匹配」learning machine"(詞彙相反)。2:允許更多彈性,包括詞彙順序顛倒或中間有兩個符號。例如:篩選「機器學習」會匹配「學習機器」(詞彙顛倒)或「機器快速促進學習」(「機器」和「學習」之間有兩個字元)。
資料集範例
假設您有一個名為tech_articles 的資料集,其中包含以下五個實體:
|
|
|---|---|
1 |
「機器學習提升大規模資料分析的效率」 |
2 |
「學習基於機器的方法對於現代人工智能的進步至關重要」 |
3 |
「深度學習機器架構優化了計算負載」 |
4 |
「機器迅速提高持續學習的模型性能」 |
5 |
「學習先進的機器演算法,擴展人工智能能力」 |
使用短語匹配進行查詢
使用query() 方法時,PHRASE_MATCH 充當標量篩選器。只有包含指定短語的文件 (受限於允許的 slop) 才會被傳回。
範例:slop = 0 (完全匹配)
此範例會傳回包含精確詞組「machine learning」的文件,其間不包含任何額外的符號。
# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"
result = client.query(
collection_name="tech_articles",
filter=filter,
output_fields=["id", "text"]
)
預期的匹配結果:
|
|
|---|---|
1 |
「機器學習提升了大規模資料分析的效率」 |
只有文件 1 以指定的順序包含精確詞組"machine learning",且沒有額外的標記。
使用短語匹配進行搜尋
在搜尋作業中,PHRASE_MATCH用於在應用向量相似性排序之前篩選文件。這種兩步驟的方法首先透過文字匹配縮小候選集的範圍,然後再根據向量內嵌對這些候選項目重新排序。
範例:斜率 = 1
在此,我們允許 slop 為 1。此過濾器適用於包含短語「學習機器」的文件,略有彈性。
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name="tech_articles",
anns_field="embeddings",
data=[query_vector],
filter=filter_slop1,
search_params={"params": {"nprobe": 10}},
limit=10,
output_fields=["id", "text"]
)
匹配結果:
|
|
|---|---|
2 |
「學習機器化對於現代人工智能的進步至關重要」 |
3 |
「深度學習機器架構可優化計算負載」 4 |
5 |
「學習先進的機器演算法可擴展 AI 能力」 6 |
範例:斜率 = 2
此範例允許 slop 為 2,意即「機器」和「學習」兩詞之間最多允許有兩個額外的標記(或相反的詞)。
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
匹配結果:
|
|
|---|---|
1 |
「機器學習提升了大規模資料分析的效率」 |
3 |
「深度學習機器架構優化了計算負載」 |
範例:斜率 = 3
在這個範例中,slop 為 3 提供了更大的彈性。篩選程式會搜尋「機器學習」,字詞之間最多允許三個符號位置。
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
匹配結果:
|
|
|---|---|
1 |
「機器學習提升了大規模資料分析的效率」 |
2 |
「學習以機器為基礎的方法對於現代人工智能的進步至關重要」 |
3 |
「深度學習機器架構優化了計算負載」 4 |
5 |
「學習先進的機器演算法可擴展 AI 能力」 6 |
注意事項
啟用欄位的詞組匹配功能會觸發建立反向索引,這會消耗儲存資源。在決定啟用此功能時,請考慮對儲存的影響,因為它會依據文字大小、獨特標記和所使用的分析器而有所不同。
一旦您在模式中定義了分析器,其設定就會永久適用於該集合。如果您認為不同的分析器更符合您的需求,您可以考慮刪除現有的集合,然後以所需的分析器設定建立新的集合。
詞組匹配的效能取決於文字的標記化方式。在將分析器套用到整個集合之前,請使用
run_analyzer方法檢視標記化輸出。如需詳細資訊,請參閱Analyzer Overview。filter表達式中的 Escape 規則:在表達式中以雙引號或單引號括住的字元會被解釋為字串常數。如果字串常數包含轉換字元,則必須使用轉換順序來表示轉換字元。例如,使用
\\表示\,使用\\t表示制表符\t,使用\\n表示換行符。如果字串常數由單引號括住,常數內的單引號應表示為
\\',而雙引號可表示為"或\\"。 例:'It\\'s milvus'。如果字串常數由雙引號括住,常數中的雙引號應表示為
\\",而單引號可表示為'或\\'。 例:"He said \\"Hi\\""。