向量查詢的運作方式是搜尋向量資料庫,找出整個叢集中與查詢向量最相符的向量。本頁將詳細說明這項功能。
尋找類似向量
向量搜尋查詢會使用兩種策略:
- 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 採用兩種方法來篩選向量搜尋運算式:
- 預先篩選:預先篩選會依據次要索引 (例如標記、數值) 找出符合篩選運算式的項目,不論向量相似度為何。計算篩選後的結果後,系統會執行暴力搜尋,依向量相似度排序。
- 內建篩選:內建篩選會執行向量搜尋演算法 (例如 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 資訊。