多模塊進行時:同時使用 RedisGraph 和 RediSearch 模塊

來源:Redislabs

作者:Kyle Davis

翻譯:Kevin (公衆號:中間件小哥)

在 2019 年的 RedisConf 會議上,我演示了一個在 RedisGraph 節點上進行全文 RediSearch 的解決方案。當時講的有點模糊,但現在,我意識到我們應該解釋一下我們是如何做到這一點併發布源代碼。

v2-9978a6bb56145b6314a95814cae6a288_hd.jpg

在這個演示中我展示了一個小界面,它支持搜索動物並通過生物分類系統(界、門、類、目等)查看它們之間的關係。全文部分基於維基百科的第一段英文。例如,搜索“寵物貓”和“Blue Whale”,會發現他們都是哺乳動物,而如果搜索“寵物貓”和“雪豹”,則會發現他們都屬於同一個科:貓科。

這個演示項目出乎意料地簡單,但我應該指出 RediSearch 和 RedisGraph 之間的集成仍處於早期階段,在編寫本文時還沒有準備好應用於生產環境。所以,我建議您在瞭解 RediSearch 和 RedisGraph 的集成將在未來幾個月逐漸成熟的前提下,確定此方法是否能夠滿足您的需求。

讓我們再討論一下如何從源碼構建。要完成的第一件事是基於代碼庫中正確的分支構建 RediSearch 和 RedisGraph。RediSearch 使用的是當前的主分支,而 RedisGraph 是 redisconf 分支。如果您想根據自己的需要構建解決方案,可以從源代碼構建這兩個模塊。RedisGraph 和 RediSearch 的網站上都有關於如何構建的詳細說明,這並不困難,只是需要一點時間。

配置模塊的位置在 redis.conf 文件中,爲了確保在 RediSearch 之前加載 RedisGraph,需要在 redis.conf 文件的模塊部分將 RediSearch 的 loadmodule 配置項放在 RedisGraph 的 loadmodule 配置項之前。在完成編輯 redis.conf 之後,需要重啓Redis 服務器讓配置生效。

在之前演示的 demo 中,我使用 RedisGraph-bulk-loader 腳本將以下內容從 CSV 加載到 RedisGraph,從而包括了我們收集的數據集。這個數據集只包括哺乳動物,因爲其他動物的數據質量較低(非哺乳動物物種很少有好的維基百科描述)。

下面是加載數據的例子:


$ cd redisgraph-bulk-loader/ $ python3 bulk_insert.py MAMMALS -q -n /path/to/demo/dataload/Class.csv -n /path/to/demo/dataload/Family.csv -n /path/to/demo/dataload/Genus.csv -n /path/to/demo/dataload/Order.csv -n /path/to/demo/dataload/Species.csv -r /path/to/demo/dataload/IN_CLASS.csv -r /path/to/demo/dataload/IN_FAMILY.csv -r /path/to/demo/dataload/IN_GENUS.csv -r /path/to/demo/dataload/IN_ORDER.csv -a yourpassword 1 nodes created with label 'Class' 157 nodes created with label 'Family' 1272 nodes created with label 'Genus' 29 nodes created with label 'Order' 5616 nodes created with label 'Species' 29 relations created for type 'IN_CLASS' 1272 relations created for type 'IN_FAMILY' 5616 relations created for type 'IN_GENUS' 157 relations created for type 'IN_ORDER' Construction of graph 'MAMMALS' complete: 7075 nodes created, 7074 relations created in 0.443749 seconds $ redis-cli -a yourpassword GRAPH.QUERY MAMMALS "CALL db.idx.fulltext.createNodeIndex('Species','description')" Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 1) (empty list or set) 2) (empty list or set) 3) 1) "Query internal execution time: 324.970000 milliseconds"


(gist:gist.github.com/stockho)


在這裏,key MAMMALS 包含了我們的整個圖表。一些重要的注意事項:

•bulk_insert.py 上的-q開關非常重要,因爲它允許在讀取 CSV 時進行智能引用。

•調用一次 redis-cli 對所有節點進行批量索引,從而爲全文搜索攝取了7000 多個文檔。

現在讓我們啓動並運行一個 UI。和幾乎所有 Node.js 應用程序一樣,我們先安裝 npm。安裝大概需要幾秒鐘,因爲我們不僅要管理Node 的服務器端文件。還有前端的 Vue.js 組件。如果你最近沒有花很多時間在前端JavaScript 上,那你大概不能使用一個 FTP 和 HTML 文件來實現這些功能。所幸現代前端確實重視工具,所以我們可以安裝 VueCLI(我建議遵循 Vue CLI 入門指南)。

在你的前端工具準備好過後,讓我們繼續來講 npm 安裝和啓動運行前端上:

$ npm run build

這將創建我們所有前端文件的 dist 目錄。現在我們有數據在 Redis 裏,我們的前端文件也準備好啓動服務,所以我們可以連接 Redis 服務器:

$ node server.js -p 6379 -a yourpassword -hyourhostOrlocalhost

讓我們先討論一下關於我們剛剛打開的這個服務器的一些問題。它構建在 Express.js上,主要使用 WebSocket 進行通信。我還集成了可視化引擎調試工具,它允許您在單獨的瀏覽器窗口中查看正在執行的命令。你可以把瀏覽器指向地址:http://localhost:4444。

總之,相對於它所實現的功能來說,它非常的簡短——只有 75 行代碼。我們的解決方案不需要那麼長,因爲我們實際上所做的就是接受WebSocket 連接,根據傳遞的消息運行 Redis 命令,然後將這些消息與結果一起傳遞回來。Redis(Graph)做了所有複雜的工作。讓我們看看正在執行的命令。

爲了搜索關鍵字,我們運行這個命令:

> GRAPH.QUERY MAMMALS"CALL db.idx.fulltext.queryNodes('Species','cat house pet')"

這很簡單。我們的鍵是哺乳動物,我們使用一個特殊的語法調用了一個特定的函數,它的第一個參數是我們要查找的節點的標籤,另一個參數是實際要搜索的字符串。您可以傳遞有效的RediSearch 參數進行查詢,但請記住,目前這只是全文本搜索,因此不要使用地理空間、標記或數字子句。

一旦我們確定了我們要比較的兩種動物,我們就可以使用一個簡單的命令進行查詢:

> GRAPH.QUERY MAMMALS"MATCH (s:Species)-[*]->(x)<-[*]-(c:Species) WHERE c.fullname ='Felis catus' AND s.fullname = 'Balaenoptera borealis' RETURN x.name,labels(x) LIMIT 1"

在 server.js 文件中,這些查詢被表示爲JavaScript 模板字符串,沒有對用戶隱藏,用戶輸入的字符串被直接插入到輸入中進行查詢。但如果在生產環境中部署類似這樣的東西,就需要小心接收和校驗用戶輸入。

如果打算修改前端代碼,請確保編輯的是/src 目錄,而不是/dist。編輯之後,您需要再次運行 npmrun build 或使用開發服務器(npmrun serve),該服務器自動編譯對前端代碼的更改,並將其提供給另一個端口。這是一個非常標準的Vue.js 和 Bootstrap 應用。唯一真正相關的文件是:/src/App.js, /src/components/panels.vue and /src/components/search.vue.

以上就是一個簡單的功能強大的 demo,集成了兩個不同的 Redismodule:RediSearch 和 RedisGraph。我鼓勵你使用你自己數據集來體驗這個 demo。

原文鏈接:https://redislabs.com/blog/multi-model-action-using-redisgraph-redisearch-together/

多優質中間件技術資訊/原創/翻譯文章/資料/乾貨,請關注“中間件小哥”公衆號!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章