查詢語法

向量查詢會搜尋向量資料庫,找出與查詢向量最相符的向量。本頁面將詳細說明這項功能的運作方式。

尋找相似向量

向量搜尋查詢採用兩種策略:

  • K 近鄰 (KNN):找出與查詢向量最相近的 k 個向量。
  • 近似近鄰 (ANN):找出與查詢向量相距約 k 個最接近的向量

如要使用 KNN,請使用 FLAT 向量索引類型建立索引。使用 KNN 時,搜尋查詢會是精確的,但速度會變慢。如要使用 ANN,請使用 HNSW 向量索引類型建立索引。使用 ANN 時,搜尋查詢會變得較為近似,但速度會更快。調整查詢中的 HNSW 索引參數和 EF_RUNTIME 參數,即可提高 ANN 準確度。

查詢語法細目

FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
  • index:包含向量欄位的索引名稱。

  • (hybrid_filter_expression):這是混合式篩選器運算式。篩選運算式僅支援標記和數字索引。如要進一步瞭解篩選運算式,請參閱混合式查詢

    • (*) 可用於執行不需要篩選的查詢。
  • =>:將篩選器與向量搜尋分開。

  • [KNN num_neighbours @field $vector]:KNN 搜尋運算式。將 num_neighbors 替換為所選的結果數量,並將 @field 替換為向量欄位的名稱。

  • PARAMS 2 my_vector_query_param "query_embedding"

    • PARAMS 後面的值 2 表示必須提供兩個額外引數。
    • my_vector_query_param 是 KNN 搜尋運算式中指定的查詢參數向量名稱。
    • query_embedding 替換為嵌入的查詢向量。
  • DIALECT 2:指定您使用的是查詢方言第 2 版或更新版本 (向量搜尋功能需要)。

混合查詢

括號內的初始運算式是篩選器運算式。您可以使用篩選運算式,在執行向量搜尋時篩選向量。使用篩選運算式篩選結果的查詢稱為混合查詢。混合查詢可包含任意組合的標記和數字索引。

Memorystore for Redis 會使用兩種方法篩選向量搜尋:

  1. 預先篩選:預先篩選會使用次要索引 (例如標記、數值),先找出符合篩選運算式的項目,不考慮向量相似度。計算出篩選結果後,系統會執行暴力搜尋,並依向量相似度排序。
  2. 內嵌篩選:內嵌篩選會執行向量搜尋演算法 (例如 HNSW),並忽略找到的向量,如果這些向量不符合篩選條件。

如果篩選後的搜尋空間比原始搜尋空間小得多,預先篩選的速度就會更快。當篩選的搜尋空間較大時,內嵌式篩選功能的速度就會加快。Memorystore for Redis 會根據提供的篩選器自動選擇這兩種策略。

篩選器運算式支援標記和數字索引。

標記索引

標記是文字欄位,會解讀為以分隔符號分隔的標記清單。一般來說,標記是小型值集,可能包含顏色、書籍類型、城市名稱或作者等有限值。

  • 只有已編入索引的欄位可用於標記篩選器。
  • TAG 欄位會使用分隔字元進行代碼化,預設為半形逗號「,」,但可在建立索引時進行設定。
  • 建立標記欄位索引時,系統不會執行詞幹處理。
  • 標記欄位只能執行前置字串精確篩選器。不支援尾碼和中置查詢。
  • 根據預設,代碼不區分大小寫。舉例來說,「Blue」和「BLUE」都會編入「blue」的索引,在混合式查詢中產生相同的結果。
  • 空字串不會編入索引或查詢。
  • 在建立索引和查詢期間,系統會移除任何後置空格。
語法

其中 {} 是語法,| 則是用於支援多個標記的 OR 運算子:

@:{  |  | ...}

舉例來說,下列查詢會傳回顏色為藍色 OR 黑色 OR 綠色的文件。

@color:{blue | black | green}

舉例來說,以下查詢會傳回包含「hello world」或「hello universe」的文件

@color:{hello world | hello universe}

數字索引

數值索引可讓查詢篩選器只傳回指定開始值和結束值之間的值。

  • 系統支援包含和不包含查詢。
  • 對於開放式查詢,可以使用 +inf、-inf 表示開始和結束範圍。

舉例來說,下列查詢會傳回 2021 年至 2024 年間 (含兩者) 出版的書籍。等價的數學運算式為 2021 <= year <= 2024

"@year:[2021 2024]"

下列查詢會傳回 2021 年 (不含) 至 2024 年 (含) 間出版的書籍。等價的數學運算式為 2021 < year <= 2024

@year:[(2021 2024]

以下查詢會傳回 2024 年前 (含) 出版的書籍。等價的數學運算式為 year <= 2024

@year:[(-inf 2024]

以下查詢會傳回 2015 年後出版的書籍 (含 2015 年)。等價的數學運算式為 year >= 2015

@year:[2015 +inf]

請參考下表,將數學運算式對應至預先篩選查詢:

數學運算式 篩選運算式
最小值 <= 欄位 <= 最大值 @field:[min max]
最小值 < 欄位 <= 最大值 @field:[(min max]
最小值 <= 欄位 < 最大值 @field:[min (max]
最小值 < 欄位 < 最大值 @field:[(min (max]
field => min @field:[min +inf]
欄位 > 最小值 @field:[(min +inf]
欄位 <= 最大值 @field:[-inf max]
欄位 < 最大 @field:[-inf (max]
field == val @field:[val val]

邏輯運算子

您可以使用多個代碼和數值欄位,搭配邏輯運算子建立複雜的查詢。

邏輯 AND

如要設定邏輯 AND,請在謂詞之間使用空格。例如:

query1 query2 query3
邏輯 OR

如要設定邏輯 OR,請在謂詞之間使用「|」字元。例如:

query1 | query2 | query3
邏輯否定

您可以在每個查詢前面加上 -,藉此否定任何查詢。排除查詢會傳回與查詢不相符的所有項目。這也包括沒有該欄位的文件。

舉例來說,針對 @genre:{comedy} 的否定查詢會傳回所有非喜劇書籍,以及所有沒有類型欄位的書籍。

下列查詢會傳回所有屬於「喜劇」類別、在 2015 年至 2024 年間未出版,或沒有年份欄位的書籍:

@genre:[comedy] -@year:[2015 2024]
邏輯運算子組合示例

您可以結合邏輯運算子,建立複雜的篩選器運算式。

下列查詢會傳回 2015 年至 2024 年間出版的所有「喜劇」或「恐怖」類型書籍 (AND):

@genre:[comedy|horror] @year:[2015 2024]

下列查詢會傳回 2015 年至 2024 年間出版的所有「喜劇」或「恐怖」類型書籍 (OR):

@genre:[comedy|horror] | @year:[2015 2024]

下列查詢會傳回所有在 2015 年至 2024 年間出版的書籍,這些書籍的類型欄位要不是空白,就是不等於「comedy」:

-@genre:[comedy] @year:[2015 2024]

如要瞭解使用方式,請參閱 FT.SEARCH 相關資訊。