模式比對

在基於代理的搜尋應用中,向量搜尋與 grep 風格的模式比對往往相輔相成。向量搜尋會檢索出語義相關的實體,而模式比對則透過精確的字串結構(例如錯誤代碼、日誌前綴、電子郵件網域、URL 路徑或識別碼)來縮小搜尋結果範圍。

在 Milvus 中,您可以透過標量篩選器來表達這些模式限制:使用LIKE 進行簡單的萬用字元匹配,以及使用=~!~ 進行RE2正規表達式匹配。您可以將這些篩選器與querysearch 或混合搜尋結合使用。

本頁面說明querysearch 以及混合搜尋所使用的標量篩選器表達式中的模式比對。這些表達式會評估欄位值,但不會變更分析器所產生的標記。若要在文字分析過程中篩選標記,請參閱「正規表達式分析器篩選器」。

模式匹配表達式需寫入 `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 」完全相等。
簡單前綴匹配LIKEname LIKE "Prod%"匹配以Prod 開頭的字串。
簡單後綴匹配LIKEfilename LIKE "%.json"匹配以.json 結尾的字串。
簡單包含匹配LIKEdescription LIKE "%vector database%"匹配字串中任何位置包含vector database 的值。
匹配結構化代碼或固定長度模式=~code =~ "E[0-9]{4}"匹配那些區分大小寫且包含E 後接四位數字的字串,例如E1001
不區分大小寫的模式比對=~ 使用(?i)message =~ "(?i)error"匹配errorERROR 或其他大小寫變體。
排除符合正規表達式模式的值!~message !~ "^DEBUG"排除以DEBUG 開頭的字串。

使用LIKE 進行簡單的萬用字元比對。當模式需要字元類別、重複、選擇(例如error|failed )、錨點或不區分大小寫的比對時,請使用正規表達式。

使用 LIKE

LIKE 運算子用於對字串值進行簡單的萬用字元比對。它僅支援以下萬用字元:

通配符說明
%匹配零個或多個字元。
_匹配恰好一個字元。

常見的 LIKE 模式

使用%_ 的位置來控制固定文字在匹配字串中的出現位置。

需求模式篩選範例
以前綴開頭Prod%filter = 'name LIKE "Prod%"'
以後綴結尾%.jsonfilter = '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 語法參考。

需求模式篩選範例
包含字面文字errorfilter = 'message =~ "error"'
以前綴開頭^ERRfilter = '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)errorfilter = '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 的正規表達式比對採用子字串語義。模式無需與整個欄位值完全匹配。例如,以下篩選器會同時匹配E1001failed 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 字串路徑的正規表達式篩選器搭配使用,例如NGRAMSTL_SORTINVERTEDBITMAP 。模式比對雖可在無索引的情況下運作,但建立索引可提升大型資料集的處理效能。

索引的效能取決於模式表達式、Milvus 能否提取固定的字面子字串,以及目標欄位的基數與分佈。前綴式模式(例如name LIKE "Prod%" )所適用的索引策略,可能與中綴或後綴模式(例如description LIKE "%vector%"filename LIKE "%.json" )有所不同。

請將下表作為起點,然後根據您自己的工作負載進行效能測試:

模式或資料特性應考慮的索引備註
包含固定的字面值子字串,例如message =~ "error.*timeout"message LIKE "%database%"NGRAM當 Milvus 能從模式中提取有意義的字面值子字串時,此設定會有所幫助。詳細資訊請參閱NGRAM
前綴、精確或等值類型的字串篩選器,特別適用於基數較低至中等的欄位STL_SORTINVERTED ,或BITMAP當欄位具有重複值,或篩選條件接近完全匹配時,此方法可能更為有效。詳情請參閱STL_SORTINVERTEDBITMAP
不含固定字面值的正規表達式模式,或以字元類別、短標記或萬用字元為主的模式在依賴索引加速之前請先進行效能測試這些模式可能僅提供有限的索引選擇性,並可能退而採用更廣泛的掃描。