写点什么

多模块进行时: 同时使用 RedisGraph 和 RediSearch 模块

  • 2020-03-01
  • 本文字数:2713 字

    阅读完需:约 9 分钟

多模块进行时:同时使用 RedisGraph 和 RediSearch 模块

在 2019 年的 RedisConf 会议上,我演示了一个在 RedisGraph 节点上进行全文 RediSearch 的解决方案。当时讲的有点模糊,但现在,我意识到我们应该解释一下我们是如何做到这一点并发布源代码。



在这个演示中我展示了一个小界面,它支持搜索动物并通过生物分类系统(界、门、类、目等)查看它们之间的关系。全文部分基于维基百科的第一段英文。例如,搜索“宠物猫”和“蓝鲸”,会发现他们都是哺乳动物,而如果搜索“宠物猫”和“雪豹”,则会发现他们都属于同一个科:猫科。


这个演示项目出乎意料地简单,但我应该指出 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 -ayourpassword1 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 relationscreated in 0.443749 seconds$ redis-cli -a yourpassword GRAPH.QUERY MAMMALS "CALLdb.idx.fulltext.createNodeIndex('Species','description')"Warning: Using a password with '-a' or '-u' option on the command lineinterface may not be safe.1) (empty list or set)2) (empty list or set)3) 1) "Query internal execution time: 324.970000 milliseconds"
复制代码


(gist:https://gist.github.com/stockholmux/0727a4a784a46f8cb9e8329d393a513a)


在这里,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://mp.weixin.qq.com/s/dbqatouGwg0P_L9_SR5v_Q


2020-03-01 21:42900

评论

发布
暂无评论
发现更多内容

本周五开讲!AI 时代的运维开发工具 OS Copilot 陪跑班,分享云上最佳实践案例

OpenAnolis小助手

Alibaba Cloud Linux OS Copilot 运维开发工具

Python的众多包管理器

我再BUG界嘎嘎乱杀

Python 编程 后端 开发语言

Python数据结构:字典详解(创建、访问、修改、字典方法)

我再BUG界嘎嘎乱杀

Python 编程 数据结构 后端 开发语言

Web 开发者必备:最推荐的工具清单

Liam

程序员 前端 Web

线上观看 3 万+!「智能可观测运维技术MeetUp」精彩回顾,探讨智能体构建新方向

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥meetup 可观测技术

Cloud Kernel SIG 月度动态:发布 ANCK 3 个版本,5.10 kABI/kAPI 策略变更

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥社区SIG Cloud Kernel

高性能网络SIG月度动态:virtio技术委员会通过flow director提案,netdim调节特性正式合入上游社区

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥社区SIG

【YashanDB知识库】存储过程报错snapshot too old

YashanDB

yashandb 崖山数据库 崖山DB

高性能存储 SIG 月度动态:优化 xfs dax reflink 时延,独立选型并维护 mdadm 和 ledmon

OpenAnolis小助手

操作系统 高性能存储 龙蜥社区SIG

阶跃星辰启动「繁星计划」开放平台;运动迁移框架 MotionClone 无需训练,一键克隆视频运动丨 RTE 开发者日报

声网

JDBC 最佳实践

FunTester

轻松应用 RapidMiner 内置案例模板实现数据挖掘详解(下篇)

Altair RapidMiner

人工智能 数据挖掘 算法 数据分析 altair

告别 CentOS,开源操作系统与时代同步更需“根”的力量

OpenAnolis小助手

操作系统 龙蜥社区 CentOS 停服

怎么填充PPT底色?分享2个办公必备的PPT技巧!

彭宏豪95

职场 PPT PPT模板 办公软件 AI生成PPT

腾讯特别调薪8%,年底十三薪分摊到月薪:福利升级还是另有深意?

王中阳Go

腾讯 面经

企业全历史行为数据助ToB企业决策层开启营销的上帝视角

客户在哪儿AI

ToB营销 ToB增长 ToB销售

苏州八大行业服务器托管方案分享?IDC机房选择经验

苏州服务器托管

算力 IDC 服务器托管

2024中国PMO高峰论坛在京成功召开

财见

玩转 Easysearch 语法

极限实验室

数据库 搜索引擎 easysearch 极限科技 征文系列

说说RabbitMQ延迟队列实现原理?

王磊

Java 面试

“Pandabuy事件后,淘宝代购集运系统如何强化仿牌敏感词风控策略“

tbapi

淘宝代购集运系统 Pandabuy 逆向海淘系统

用这2款AIPPT软件,让你的Markdown生成PPT!

彭宏豪95

人工智能 PPT 在线白板 AIGC AI生成PPT

“SelectDB 实时数据仓库解决方案”入围工信部“信息技术应用创新典型解决方案”

SelectDB

数据库 大数据 数据仓库 云原生 信创

阿里云大牛熬夜整理的Python大数据小抄,GitHub星标125K!

我再BUG界嘎嘎乱杀

Python 大数据 编程 后端 开发语言

Databend 完美适配 KubeSphere 企业版 4.1.1,让云原生技术更普及

Databend

破局移动影像,华为的化境是绝无止境

脑极体

AI

数据可视化在石油新能源行业的应用:深度探索与前沿趋势

不在线第一只蜗牛

数据挖掘 数据分析 低代码 数据可视化

22 位委员参会,第 25 次龙蜥社区运营委员会圆满结束

OpenAnolis小助手

操作系统 龙蜥社区

多模块进行时:同时使用 RedisGraph 和 RediSearch 模块_行业深度_翻译自redis.io_InfoQ精选文章