查詢語法

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

尋找類似向量

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

  • 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 Cluster 採用兩種方法來篩選向量搜尋運算式:

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

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

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

標記索引

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

  • 只有編入索引的欄位才能做為標記篩選器。
  • TAG 欄位會以分隔字元 (預設為半形逗號「,」,但可在建立索引時設定) 進行代碼化。
  • 為標記欄位建立索引時,系統不會執行詞幹還原。
  • 您只能對標記欄位執行前置字串和完全相符的前置篩選器。不支援尾碼和中綴查詢。
  • 根據預設,標記不區分大小寫。舉例來說,「Blue」和「BLUE」都會編入索引為「blue」,在混合查詢中會產生相同的結果。
  • 系統不會為空字串建立索引或查詢空字串。
  • 在建立索引和查詢期間,系統會移除所有結尾空白字元。
語法

其中 {} 是語法的一部分,| 則做為 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]
min < 欄位 <= max @field:[(min max]
最小值 <= 欄位 < 最大值 @field:[min (max]
min < field < max @field:[(min (max]
field => min @field:[min +inf]
欄位 > 分鐘 @field:[(min +inf]
欄位 <= max @field:[-inf max]
欄位 < 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]
合併邏輯運算子的範例

您可以結合邏輯運算子,形成複雜的篩選運算式。

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

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

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

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

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

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

如要瞭解如何使用,請參閱 FT.SEARCH 資訊。