模式比對
在基於代理的搜尋應用中,向量搜尋與 grep 風格的模式比對往往相輔相成。向量搜尋會檢索出語義相關的實體,而模式比對則透過精確的字串結構(例如錯誤代碼、日誌前綴、電子郵件網域、URL 路徑或識別碼)來縮小搜尋結果範圍。
在 Milvus 中,您可以透過標量篩選器來表達這些模式限制:使用LIKE 進行簡單的萬用字元匹配,以及使用=~ 或!~ 進行RE2正規表達式匹配。您可以將這些篩選器與query 、search 或混合搜尋結合使用。
本頁面說明query 、search 以及混合搜尋所使用的標量篩選器表達式中的模式比對。這些表達式會評估欄位值,但不會變更分析器所產生的標記。若要在文字分析過程中篩選標記,請參閱「正規表達式分析器篩選器」。
模式匹配表達式需寫入 `filter ` 參數中。例如,以下查詢會匹配包含如 `E1001` 此類錯誤代碼的日誌訊息:
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
res = client.query(
collection_name="log_events",
filter='message =~ "E[0-9]{4}"',
output_fields=["message", "severity"],
)
本頁面的範例著重於指派給 `filter` 的表達式。您可以在接受標量篩選器的 Milvus 操作中使用相同的篩選表達式語法,例如 `query`、`search` 以及混合搜尋。
支援的欄位類型
模式比對僅適用於字串值。
| 目標 | LIKE | 正規表達式=~ /!~ | 備註 |
|---|---|---|---|
VARCHAR 欄位 | 是 | 是 | 字串欄位進行模式比對的典型目標。 |
JSON 路徑,其VARCHAR 已轉換為指定類型 | 是 | 是 | 若要進行正向匹配,JSON 路徑值必須為字串。若您為加速目的在 JSON 路徑上建立索引,請設定json_cast_type="varchar" 。 |
ARRAY<VARCHAR> 元素 | 是 | 是 | 根據索引匹配特定元素,例如tags[0] 。模式匹配不會掃描所有元素;它僅適用於指定索引處的元素。 |
數值、布林值、向量、TEXT 或其他非VARCHAR 目標 | 否 | 否 | 模式匹配僅適用於VARCHAR 值、解析後為字串的JSON路徑,或具索引的ARRAY<VARCHAR> 元素。 |
選擇 LIKE 或正規表達式
請選擇能最簡潔地表達所需模式的運算子。
若需進行字串精確比對,建議您使用 `== ` 而非模式比對。僅當篩選條件需要比對特定模式時,才應使用 `LIKE ` 或正規表達式。
| 需求 | 建議運算子 | 範例 | 說明 |
|---|---|---|---|
| 字串完全相等 | == | status == "active" | 與字串「active 」完全相等。 |
| 簡單前綴匹配 | LIKE | name LIKE "Prod%" | 匹配以Prod 開頭的字串。 |
| 簡單後綴匹配 | LIKE | filename LIKE "%.json" | 匹配以.json 結尾的字串。 |
| 簡單包含匹配 | LIKE | description LIKE "%vector database%" | 匹配字串中任何位置包含vector database 的值。 |
| 匹配結構化代碼或固定長度模式 | =~ | code =~ "E[0-9]{4}" | 匹配那些區分大小寫且包含E 後接四位數字的字串,例如E1001 。 |
| 不區分大小寫的模式比對 | =~ 使用(?i) | message =~ "(?i)error" | 匹配error 、ERROR 或其他大小寫變體。 |
| 排除符合正規表達式模式的值 | !~ | message !~ "^DEBUG" | 排除以DEBUG 開頭的字串。 |
使用LIKE 進行簡單的萬用字元比對。當模式需要字元類別、重複、選擇(例如error|failed )、錨點或不區分大小寫的比對時,請使用正規表達式。
使用 LIKE
LIKE 運算子用於對字串值進行簡單的萬用字元比對。它僅支援以下萬用字元:
| 通配符 | 說明 |
|---|---|
% | 匹配零個或多個字元。 |
_ | 匹配恰好一個字元。 |
常見的 LIKE 模式
使用% 和_ 的位置來控制固定文字在匹配字串中的出現位置。
| 需求 | 模式 | 篩選範例 |
|---|---|---|
| 以前綴開頭 | Prod% | filter = 'name LIKE "Prod%"' |
| 以後綴結尾 | %.json | filter = 'filename LIKE "%.json"' |
| 包含子字串 | %vector% | filter = 'description LIKE "%vector%"' |
| 匹配固定位置上的單一字元 | AB_% | filter = 'code LIKE "AB_%"' |
LIKE 匹配行為
請使用LIKE 進行前綴、後綴、包含以及固定位置單一字元匹配。LIKE 不支援字元類別(例如[0-9] )、選擇關係(例如error|failed )、重複次數(例如{4} )、錨點(例如^ 或$ ),亦不支援不區分大小寫的標誌(例如(?i) )。若需使用這些模式,請改用正規表達式。
若需進行完全字串相等比對,請使用== 。僅當篩選條件需要通配符匹配時,才使用LIKE 。
在 LIKE 模式中對通配符進行轉義
在LIKE 模式中,% 匹配零個或多個字元,而_ 則匹配精確一個字元。若要精確匹配% 、_ 或\ 這些字面值,請使用反斜線 (\) 對字元進行轉義:
name LIKE r"\%"會匹配字面值%。name LIKE r"\_%"匹配以字面值_開頭的值。name LIKE r"\\%"匹配以字面值反斜線開頭的值。
原始字串字面值(寫法為r"..." 或r'...' )會在 Milvus 篩選器表達式中保留反斜線的原始形式。建議在LIKE 以及包含反斜線的正規表達式中使用此格式。若未使用原始字串,一般字串字面值在評估模式前仍會處理轉義序列,因此可能需要更多反斜線。
使用正規表達式Compatible with Milvus 3.0.x
當模式需要正則表達式功能(例如字元類別、重複、選擇、錨點或不區分大小寫的匹配)時,請使用正則表達式篩選器。Milvus 會將RE2正則表達式套用至字串值。
=~ 或!~ 的右側必須為字串文字。
| 運算子 | 含義 | 範例 |
|---|---|---|
=~ | 匹配符合正規表達式模式的值。 | filter = 'message =~ "E[0-9]{4}"' |
!~ | 排除符合正規表達式模式的值。 | filter = 'message !~ "^DEBUG"' |
使用原始字串文字
對於包含反斜線的正規表達式模式,建議使用原始字串文字。在以r"..." 或r'...' 形式寫入的原始字串中,反斜線會原樣傳遞給正規表達式引擎。這可避免一般字串文字所需的額外轉義。
例如:
filter = 'message =~ r"\d{4}-\d{2}-\d{2}"'
這會匹配包含類似日期的字串,例如2026-07-01 。
若未使用原始字串,一般字串文字會在評估正規表達式模式之前先處理轉義序列,因此像\d 、\s 這樣的模式,或是包含轉義字元字面值的字串,可能需要額外的反斜線。
常見的正規表達式模式
以下範例在 Milvus 篩選器表達式中使用常見的 RE2 語法。如需完整的正規表達式語法,請參閱RE2 語法參考。
| 需求 | 模式 | 篩選範例 |
|---|---|---|
| 包含字面文字 | error | filter = 'message =~ "error"' |
| 以前綴開頭 | ^ERR | filter = 'code =~ "^ERR"' |
| 以後綴結尾 | \.json$ | filter = 'filename =~ "\\.json$"' |
| 匹配一串數字 | [0-9]+ | filter = 'message =~ "[0-9]+"' |
| 匹配固定數量的數字 | [0-9]{4} | filter = 'code =~ "[0-9]{4}"' |
| 匹配電子郵件網域 | @example\.com$ | filter = 'email =~ "@example\\.com$"' |
| 不區分大小寫 | (?i)error | filter = 'message =~ "(?i)error"' |
| 匹配完整字串 | ^prod-[0-9]+$ | filter = 'name =~ "^prod-[0-9]+$"' |
若要匹配多個單字中的任一個,請使用| 進行選擇:
filter = 'message =~ "error|failed|timeout"'
若要字面匹配正則表達式元字元,請在正則表達式模式中對其進行轉義。例如,若要匹配字面上的點(正則表達式中的 `\. `),請在 Python 篩選器字串中寫作 `\\. `:
filter = 'email =~ "@gmail\\.com$"'
注意:Milvus 的正規表達式篩選器遵循 RE2 語法。若正規表達式模式使用了 RE2 不支援的語法,或因其他原因而無效,Milvus 將拒絕該篩選器表達式。有關正規表達式元字元、標誌及匹配行為的詳細資訊,請參閱RE2 語法參考。
匹配行為
子字串匹配
Milvus 的正規表達式比對採用子字串語義。模式無需與整個欄位值完全匹配。例如,以下篩選器會同時匹配E1001 和failed with E1001 after retry :
filter = 'message =~ "E[0-9]{4}"'
若要匹配整個欄位值,請使用^ 和$ 錨點:
# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'
可為空的 VARCHAR 欄位
正規表達式篩選器不會匹配 null 值。這同時適用於=~ 和!~ 。若要排除某個正規表達式模式但保留 null 值,請明確加入OR field IS NULL :
filter = 'message !~ "^DEBUG" OR message IS NULL'
JSON 路徑
對於 JSON 路徑,當路徑缺失、為 null 或解析為非字串值時,正規表達式篩選器的行為會有所不同:
| 篩選器 | 是否包含缺失/null/非字串值? | 備註 |
|---|---|---|
json_field["path"] =~ "pattern" | 否 | 僅匹配符合正規表達式模式的字串值。 |
json_field["path"] !~ "pattern" | 是 | 回傳路徑為缺失、null、非字串,或不符合正規表達式模式之字串的實體。 |
利用索引加速模式比對
Milvus 支援多種適用於字串欄位的索引類型,可與LIKE 以及針對VARCHAR 欄位或 JSON 字串路徑的正規表達式篩選器搭配使用,例如NGRAM 、STL_SORT 、INVERTED 及BITMAP 。模式比對雖可在無索引的情況下運作,但建立索引可提升大型資料集的處理效能。
索引的效能取決於模式表達式、Milvus 能否提取固定的字面子字串,以及目標欄位的基數與分佈。前綴式模式(例如name LIKE "Prod%" )所適用的索引策略,可能與中綴或後綴模式(例如description LIKE "%vector%" 或filename LIKE "%.json" )有所不同。
請將下表作為起點,然後根據您自己的工作負載進行效能測試:
| 模式或資料特性 | 應考慮的索引 | 備註 |
|---|---|---|
包含固定的字面值子字串,例如message =~ "error.*timeout" 或message LIKE "%database%" | NGRAM | 當 Milvus 能從模式中提取有意義的字面值子字串時,此設定會有所幫助。詳細資訊請參閱NGRAM。 |
| 前綴、精確或等值類型的字串篩選器,特別適用於基數較低至中等的欄位 | STL_SORT、INVERTED ,或BITMAP | 當欄位具有重複值,或篩選條件接近完全匹配時,此方法可能更為有效。詳情請參閱STL_SORT、INVERTED 及BITMAP。 |
| 不含固定字面值的正規表達式模式,或以字元類別、短標記或萬用字元為主的模式 | 在依賴索引加速之前請先進行效能測試 | 這些模式可能僅提供有限的索引選擇性,並可能退而採用更廣泛的掃描。 |