使用 RedisVL 進行復雜查詢

一、前置條件

在開始之前,請確保:

  • 已安裝 redisvl 并激活相應的 Python 環境。
  • 運行 Redis 實例,且 RediSearch 版本 > 2.4。

二、初始化與數據加載

我們將使用一個包含用戶信息的數據集,字段包括 useragejobcredit_scoreoffice_locationuser_embeddinglast_updated。以下是初始化索引和加載數據的代碼:

import pickle
from redisvl.index import SearchIndex# 加載示例數據
data = pickle.load(open("hybrid_example_data.pkl", "rb"))# 定義索引架構
schema = {"index": {"name": "user_queries","prefix": "user_queries_docs","storage_type": "hash",},"fields": [{"name": "user", "type": "tag"},{"name": "credit_score", "type": "tag"},{"name": "job", "type": "text"},{"name": "age", "type": "numeric"},{"name": "last_updated", "type": "numeric"},{"name": "office_location", "type": "geo"},{"name": "user_embedding","type": "vector","attrs": {"dims": 3,"distance_metric": "cosine","algorithm": "flat","datatype": "float32"}}],
}# 創建搜索索引
index = SearchIndex.from_dict(schema, redis_url="redis://localhost:6379")
index.create(overwrite=True)# 加載數據
keys = index.load(data)
print(index.info()['num_docs'])  # 輸出:7

使用 rvl CLI 檢查索引:

rvl index listall

三、混合查詢

混合查詢結合多種過濾器,例如根據年齡、職業和地理位置進行篩選。以下展示不同類型的過濾器及其應用。

3.1.標簽過濾器(Tag Filters)

標簽過濾器用于對分類字段(如 credit_score)進行精確匹配。

from redisvl.query import VectorQuery
from redisvl.query.filter import Tag# 篩選信用評分為 "high" 的用戶
t = Tag("credit_score") == "high"
v = VectorQuery(vector=[0.1, 0.1, 0.5],vector_field_name="user_embedding",return_fields=["user", "credit_score", "age", "job", "office_location", "last_updated"],filter_expression=t
)
results = index.query(v)

輸出:

vector_distance  user    credit_score  age  job            office_location      last_updated
0               john    high          18   engineer       -122.4194,37.7749    1741627789
0.109129190445  tyler   high          100  engineer       -122.0839,37.3861    1742232589
0.158808946609  tim     high          12   dermatologist  -122.0839,37.3861    1739644189
0.266666650772  nancy   high          94   doctor         -122.4194,37.7749    1710696589

支持否定和多值匹配:

# 否定:非 "high" 信用評分
t = Tag("credit_score") != "high"
v.set_filter(t)
results = index.query(v)
# 多值匹配:信用評分為 "high" 或 "medium"
t = Tag("credit_score") == ["high", "medium"]
v.set_filter(t)
results = index.query(v)

空標簽列表會優雅地回退為通配符查詢:

t = Tag("credit_score") == []
v.set_filter(t)
results = index.query(v)

3.2.數值過濾器(Numeric Filters)

數值過濾器用于篩選數值字段的范圍或精確值。

from redisvl.query.filter import Num# 篩選年齡在 15-35 歲的用戶
numeric_filter = Num("age").between(15, 35)
v.set_filter(numeric_filter)
results = index.query(v)

輸出:

vector_distance  user    credit_score  age  job     office_location      last_updated
0               john    high          18   engineer  -122.4194,37.7749    1741627789
0.217882037163  taimur  low           15   CEO       -122.0839,37.3861    1742232589
0.653301358223  joe     medium        35   dentist   -122.0839,37.3861    1742232589

支持精確匹配和否定:

# 精確匹配:年齡為 14
numeric_filter = Num("age") == 14
v.set_filter(numeric_filter)
# 否定:年齡不為 14
numeric_filter = Num("age") != 14
v.set_filter(numeric_filter)

3.3.時間戳過濾器(Timestamp Filters)

時間戳過濾器支持使用 Python 的 datetime 對象進行時間篩選。

from redisvl.query.filter import Timestamp
from datetime import datetimedt = datetime(2025, 3, 16, 13, 45, 39, 132589)
timestamp_filter = Timestamp("last_updated") > dt
v.set_filter(timestamp_filter)
results = index.query(v)

輸出:

vector_distance  user    credit_score  age  job       office_location      last_updated
0.109129190445  tyler   high          100  engineer  -122.0839,37.3861    1742232589
0.217882037163  taimur  low           15   CEO       -122.0839,37.3861    1742232589
0.653301358223  joe     medium        35   dentist   -122.0839,37.3861    1742232589

支持范圍查詢:

dt_1 = datetime(2025, 1, 14, 13, 45, 39, 132589)
dt_2 = datetime(2025, 3, 16, 13, 45, 39, 132589)
timestamp_filter = Timestamp("last_updated").between(dt_1, dt_2)
v.set_filter(timestamp_filter)

3.4.文本過濾器(Text Filters)

文本過濾器用于對文本字段進行精確、模糊或通配符匹配。

from redisvl.query.filter import Text# 精確匹配:職業為 "doctor"
text_filter = Text("job") == "doctor"
v.set_filter(text_filter)

輸出:

vector_distance  user    credit_score  age  job     office_location      last_updated
0               derrick low           14   doctor  -122.4194,37.7749    1741627789
0.266666650772  nancy   high          94   doctor  -122.4194,37.7749    1710696589

支持通配符和模糊匹配:

# 通配符:職業以 "doct" 開頭
wildcard_filter = Text("job") % "doct*"
v.set_filter(wildcard_filter)
# 模糊匹配:職業包含 "engine"
fuzzy_match = Text("job") % "%%engine%%"
v.set_filter(fuzzy_match)

支持條件匹配:

# 條件匹配:職業為 "engineer" 或 "doctor"
conditional = Text("job") % "engineer|doctor"
v.set_filter(conditional)

3.5.地理過濾器(Geo Filters)

地理過濾器用于篩選指定位置和半徑范圍內的記錄。

from redisvl.query.filter import Geo, GeoRadius# 篩選距離舊金山辦公室 10 公里內的用戶
geo_filter = Geo("office_location") == GeoRadius(-122.4194, 37.7749, 10, "km")
v.set_filter(geo_filter)

輸出:

score            vector_distance  user    credit_score  age  job            office_location
0.454545444693   0               john    high          18   engineer       -122.4194,37.7749
0.454545444693   0               derrick low           14   doctor         -122.4194,37.7749
0.454545444693   0.266666650772  nancy   high          94   doctor         -122.4194,37.7749

支持否定查詢:

# 非 10 公里范圍內的用戶
geo_filter = Geo("office_location") != GeoRadius(-122.4194, 37.7749, 10, "km")
v.set_filter(geo_filter)

3.6.組合過濾器

通過 &(交集)和 |(并集)操作符組合多種過濾器。

t = Tag("credit_score") == "high"
low = Num("age") >= 18
high = Num("age") <= 100
ts = Timestamp("last_updated") > datetime(2025, 3, 16, 13, 45, 39, 132589)
combined = t & low & high & ts
v = VectorQuery([0.1, 0.1, 0.5],"user_embedding",return_fields=["user", "credit_score", "age", "job", "office_location"],filter_expression=combined
)
results = index.query(v)

輸出:

vector_distance  user    credit_score  age  job       office_location
0.109129190445  tyler   high          100  engineer  -122.0839,37.3861

并集查詢:

low = Num("age") < 18
high = Num("age") > 93
combined = low | high
v.set_filter(combined)

動態組合過濾器:

def make_filter(age=None, credit=None, job=None):flexible_filter = ((Num("age") > age) &(Tag("credit_score") == credit) &(Text("job") % job))return flexible_filter# 示例:篩選年齡 > 18,信用評分為 high,職業為 engineer
combined = make_filter(age=18, credit="high", job="engineer")
v.set_filter(combined)
results = index.query(v)

四、非向量查詢

使用 FilterQuery 執行類似 SQL 的非向量查詢:

from redisvl.query import FilterQueryhas_low_credit = Tag("credit_score") == "low"
filter_query = FilterQuery(return_fields=["user", "credit_score", "age", "job", "location"],filter_expression=has_low_credit
)
results = index.query(filter_query)

輸出:

user    credit_score  age  job
derrick low           14   doctor
taimur  low           15   CEO

五、計數查詢

使用 CountQuery 統計符合條件的記錄數:

from redisvl.query import CountQueryhas_low_credit = Tag("credit_score") == "low"
filter_query = CountQuery(filter_expression=has_low_credit)
count = index.query(filter_query)
print(f"{count} records match the filter expression {str(has_low_credit)}")

輸出:

4 records match the filter expression @credit_score:{low}

六、范圍查詢

RangeQuery 用于篩選向量距離在指定閾值內的記錄:

from redisvl.query import RangeQueryrange_query = RangeQuery(vector=[0.1, 0.1, 0.5],vector_field_name="user_embedding",return_fields=["user", "credit_score", "age", "job", "location"],distance_threshold=0.2
)
results = index.query(range_query)

輸出:

vector_distance  user    credit_score  age  job
0               john    high          18   engineer
0               derrick low           14   doctor
0.109129190445  tyler   high          100  engineer
0.158808946609  tim     high          12   dermatologist

調整距離閾值:

range_query.set_distance_threshold(0.1)
results = index.query(range_query)

結合過濾器:

is_engineer = Text("job") == "engineer"
range_query.set_filter(is_engineer)
results = index.query(range_query)

七、高級查詢修飾符

支持排序、方言選擇等高級功能:

v = VectorQuery(vector=[0.1, 0.1, 0.5],vector_field_name="user_embedding",return_fields=["user", "credit_score", "age", "job", "office_location"],num_results=5,filter_expression=is_engineer
).sort_by("age", asc=False).dialect(3)
results = index.query(v)

輸出:

vector_distance  age  user    credit_score  job       office_location
0.109129190445  100  tyler   high          engineer  -122.0839,37.3861
0               18   john    high          engineer  -122.4194,37.7749

八、原始 Redis 查詢字符串

將查詢轉換為原始 Redis 查詢字符串:

str(v)

輸出:

@job:("engineer")=>[KNN 5 @user_embedding $vector AS vector_distance] RETURN 6 user credit_score age job office_location vector_distance SORTBY age DESC DIALECT 3 LIMIT 0 5

直接使用原始查詢字符串:

results = index.search("@credit_score:{high}")
for r in results.docs:print(r.__dict__)

九、清理

刪除索引:

index.delete()

十、總結

RedisVL 提供了靈活的查詢接口,支持標簽、數值、時間戳、文本、地理等多種過濾器,以及向量、非向量、計數和范圍查詢。通過組合過濾器和動態參數化,開發者可以構建高效的搜索應用,適用于從簡單到復雜的場景。更多查詢修飾符和 API 詳情,請參閱 RedisVL 官方文檔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88130.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「Linux文件及目錄管理」vi、vim編輯器

知識點解析 vi/vim編輯器簡介 vi:Linux默認的文本編輯器,基于命令行操作,功能強大。vim:vi的增強版,支持語法高亮、多窗口編輯、插件擴展等功能。vi/vim基本模式 命令模式:默認模式,用于移動光標、復制、粘貼、刪除等操作。插入模式:按i進入,用于輸入文本。末行模式:…

電容器保護測控裝置如何選型?

在電力系統的無功補償環節&#xff0c;?電容器保護測控裝置是保障并聯電容器組安全穩定運行的核心設備。其選型需綜合考量保護需求、系統環境及擴展功能。以下是關鍵選型要素分析&#xff1a; ?一、明確核心功能需求? 電容器保護測控裝置&#xff0c;選型時需匹配電容器組實…

最近小峰一直在忙國際化項目,確實有點分身乏術... [特殊字符] 不過! 我正緊鑼密鼓準備一系列干貨文章/深度解析

本人詳解 大家晚上好呀&#xff01;&#x1f319; 最近小峰一直在忙國際化項目&#xff0c;確實有點分身乏術... &#x1f605; 不過&#xff01; 我正緊鑼密鼓準備一系列干貨文章/深度解析&#xff08;選一個更符合你內容的詞&#xff09;&#xff0c;很快就會和大家見面啦&am…

OpenCV CUDA模塊設備層-----設備端(GPU)線程塊級別的一個內存拷貝工具函數blockCopy()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在同一個線程塊&#xff08;thread block內&#xff0c;將 [beg, end) 范圍內的數據并行地復制到 out 開始的位置。 它使用了 CUDA 線程協作機制…

https沒有證書可以訪問嗎?外網怎么訪問內網?

沒有SSL證書的網站無法正常通過HTTPS協議訪問?。HTTPS的實現必須依賴有效的SSL證書完成加密握手&#xff0c;否則瀏覽器會直接阻斷連接或顯示嚴重的安全警告。?? 一、技術實現層面? ?HTTPS協議強制要求證書?。 HTTPS基于SSL/TLS協議實現加密通信&#xff0c;而SSL證書是…

Python pytesseract【OCR引擎庫】 簡介

想全面了解DeepSeek的看過來 【包郵】DeepSeek全攻略 人人需要的AI通識課 零基礎掌握DeepSeek的實用操作手冊指南【限量作者親筆簽名版售完即止】 玩轉DeepSeek這本就夠了 【自營包郵】DeepSeek實戰指南 deepseek從入門到精通實用操作指南現代科技科普讀物AI普及知識讀物人工智…

ubuntu安裝postman教程并中文漢化詳細教程

一、下載postman安裝包 通過網盤分享的文件:Postman-linux-x64-8.7.0.tar.gz 鏈接: https://pan.baidu.com/s/10WYeguDJlK85cKJ6ptX01w?pwd=xqkh 提取碼: xqkh 二、解壓到/opt目錄 tar -zxvf Postman-linux-x64-8.7.0.tar.gz如果子用戶沒有/opt權限,可以給子用戶賦予/opt的…

《壘球知識科普》壘球世界紀錄·壘球1號位

奧運壘球冠軍記錄 歷屆冠軍榜 1996亞特蘭大奧運會 冠軍&#xff1a;美國隊 ? 首屆奧運壘球賽&#xff0c;美國主場3戰全勝奪冠&#xff01; 1996 Atlanta Olympics Champion: USA ? Dominated all 3 games in first Olympic softball event 2000悉尼奧運會 冠軍&#…

通信網絡編程3.0——JAVA

主要添加了私聊功能 1服務器類定義與成員變量 public class ChatServer {int port 6666;// 定義服務器端口號為 6666ServerSocket ss;// 定義一個 ServerSocket 對象用于監聽客戶端連接//List<Socket> clientSockets new ArrayList<>();// 定義一個列表用于存儲…

RediSearch `FT.CREATE` 完全參數指南 HASH/JSON 雙寫實戰

1、索引與 Schema 速概 索引 (index) —— 倒排、前綴、向量、Geo … 元數據集合Schema —— 索引藍圖&#xff1a;定義字段、類型、權重、排序及存儲策略FT.CREATE —— 創建索引命令&#xff0c;分「索引級參數」和「字段級參數」兩層 2 、FT.CREATE 語法模板 FT.CREATE &…

QT學習教程(三十七)

系統繁忙時的響應&#xff08;Staying Responsive During Intensive Processing&#xff09; 當我們調用QApplication::exec()時&#xff0c;Qt 就開始了事件循環。啟動時&#xff0c;Qt 發出顯示和繪制事件&#xff0c;把控件顯示出來。然后&#xff0c;事件循環就開始了&…

hot100 -- 17.技巧

1.多數元素 問題&#xff1a; 給定一個大小為 n 的數組 nums &#xff0c;返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 方法1&#xff1a; 哈希表 實時判斷&#xff…

算法第39天| 打家劫舍 1、2、3

198. 打家劫舍 題目 思路與解法 class Solution { public:int rob(vector<int>& nums) {// dp數組含義&#xff1a;// 考慮下標i&#xff08;包括i&#xff09;以內的房屋&#xff0c;最多可以偷竊的金額為dp[i]if (nums.size() 0) return 0;if (nums.size() 1)…

車載CAN總線數據采集與故障診斷裝置設計與實現

車載CAN總線數據采集與故障診斷裝置設計與實現 鏈接:1.6W字 [下載]摘要1.1 研究背景1.2 研究意義(1)技術提升:推動CAN總線診斷的智能化與實時性(2)經濟價值:降低診斷成本與維修時間(3)安全與標準化:促進車聯網數據安全體系建設社會效益1.3 國內外研究現狀1.3.1 國外研…

布瑞琳BRANEW:高端洗護領航者,鑄就品質生活新典范

近日,布瑞琳BRANEW,這一中國高端洗護行業的領軍品牌,再次憑借其卓越的服務品質、創新的經營模式以及對行業標準的深度推動,成為市場矚目的焦點。作為北京2022年冬奧會和殘奧會的商業服務保障單位,布瑞琳不僅展現了其無與倫比的服務能力,更在國際舞臺上彰顯了品牌的非凡影響力。…

AWS服務器擴充硬盤

1、在控制臺上將需要擴充的硬盤增加空間 將硬盤大小由原來的50G升級到200G 2、登錄所掛載的服務器 1&#xff09;查看硬盤分區情況 adminip-172-31-121-13:~$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 200G 0 disk ├─nv…

嵌入式自學第四十二天

PWM:脈沖寬度調制&#xff0c;調節電壓為方波。關鍵參數&#xff1a;占空比、周期。 UART&#xff1a;通用異步收發器。 參與通信的設備&#xff1a;主機host 通信的本質&#xff1a;數據的傳遞。 通信方式&#xff1a; 單工&#xff1a;只能單向傳遞 半雙工&#xff1a;雙向…

人工智能如何重塑教育體系:個性化學習的新時代

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;教育的“智能革命”正在發生 教育作為人類社會發展的基石&#xff0c;始終緊隨技術進步不斷演化。從印刷術帶來知識…

【云原生】基礎篇

?一、云原生 1.1 本質與核心技術體系? 云原生&#xff08;Cloud Native&#xff09;是以容器化、微服務、聲明式API和動態編排為核心的架構范式&#xff0c;旨在最大化利用云的彈性、可觀測性和自動化能力。其技術棧分層如下&#xff1a; ?1.2、云原生核心技術棧? ?層級…

實時反欺詐:基于 Spring Boot 與 Flink 構建信用卡風控系統

在金融科技飛速發展的今天&#xff0c;信用卡欺詐手段日益高明和快速。傳統的基于批處理的事后分析模式已難以應對實時性要求極高的欺詐場景。本文將詳細介紹如何利用 Spring Boot 和 Apache Flink 這對強大的組合&#xff0c;構建一個高性能、可擴展的實時信用卡反欺詐系統。 …