gpt4 book ai didi

ruby - 如何将此 SQL 结构化为 redis 数据库

转载 作者:可可西里 更新时间:2023-11-01 11:30:04 26 4
gpt4 key购买 nike

我在理解如何将此 SQL 数据库转换为 Redis 数据库时遇到了一些麻烦。它是一个一对多的数据库,由关键字、响应和链接两者的关联表组成。

在关键字表中我有:

|ID---Keyword|
1 This
2 Cool

在响应表中我有

|ID---Response|
1 "I agree"
2 "wow"

在相关表中我有:

|ResponseID---KeywordID|
1 1
1 2
2 2

为了尝试在 Redis 中解决这个问题,我尝试使用纯字符串创建关键字 ID 到关键字的索引:

set keyword:1 This
set keyword:2 Cool

与响应相同:

set response:1 "I agree"
set response:2 "wow"

然后我用集合来加入这两个:

sadd keyword:1:response 1
sadd keyword:2:response 1
sadd keyword:2:response 2

现在我遇到的问题是如何像在 SQL 数据库上那样轮询数据。我不确定这个问题是由于缺少添加到 redis 数据库的信息还是我没有经验。

基本上我想从我的软件中获取一组关键字,例如:“This”、“Cool”,然后查找它们的 ID(分别为 1 和 2)。然后从他们的 ID 使用相关索引找到响应 ID,然后使用响应 ID 获取响应字符串。请注意,我需要首先让数据返回与最多关键字匹配的响应,因此如果给出“This”、“Cool”,则会显示“我同意”的响应,尽管如果只给出关键字“Cool”“哇”和“我同意”将被检索。

这样做的目的是,当指定的关键字越多时,针对这些关键字的响应就越具体。关键词越少,越有可能成为一般性的回应。从上面可以看出,当指定两个关键字时,只有一个响应,而当指定一个关键字时,有两个响应。 如果可能的话,如果我可以将这些结果从匹配最多的关键字到最少匹配的关键字进行排序,这也会很有帮助。

关于 redis 数据库中足够的数据来实现这一点,我是否缺少某些东西?或者这更多的是在访问 redis 数据库的客户端应用程序中完成。

我将通过 ruby​​ 访问 redis 数据库,但如果这需要显示任何代码示例,我可以使用任何语言并将其移植过来。

最佳答案

一个可能的解决方案是将关键字映射到一组 Redis 响应。

keyword1 => { response1, response2 }
keyword2 => { response1, response 3 }

您从软件中获取关键字、响应 id 以及响应字符串的过程是用这种结构解决的。当您添加回复时,您会将它们添加到适当的关键字。

您可以使用 SCARD 获取一组中的响应数。我个人认为没有更简单的结构可以在给定关键字列表的情况下为您提供最多匹配的关键字。

使用集的一个潜在有用的改进是拥有一个响应列表,这样您就可以将关键字映射存储到 redis 响应 ID 集。这将涉及一个额外的步骤,即使用响应 ID 从 Redis 检索实际响应。

keyword1 => { 0, 1 }
keyword2 => { 0, 2 }
responses => [ response1, response2, response3]

其他想法

您还询问了 Redis 数据库中是否有足够的数据来实现这一点。鉴于上述结构,数据就在那里,但您需要决定如何/在何处计算给定关键字列表的响应计数。您可以编写一个 lua 脚本来返回将在 redis 客户端上执行的匹配关键字最多到最少的排序列表。您还可以接收 redis 集并从 ruby​​ 计算该信息。

你应该看看 Sets 的 redis 文档:

Redis Sets

如果您想找到许多关键字之间的响应重叠,命令 SINTER 可能会派上用场。

更新:

我认为最简单的方法是将所有响应放在 lua 中的一个大表中,然后返回响应表及其计数。例如:

k1 => r1, r2, r3
k2 => r1, r2
k3 => r1, r3

在这种情况下,我们最终会返回:

r1: 3
r2: 2
r3: 2

然后您可以使用该表来确定如何处理您的结果。下面是一些 lua sudo 代码:

local allResponses = {}

-- go over the keys and add their responses to the global response table
for keyIndex, keyword in ipairs(KEYS) do
local responses = redis.call('smembers', keyword);
allResponses.add(responses)
end

local counts = {}
for responseIndex, response in ipairs(allResponses) do
counts[response] = counts[response] + 1
end

return counts

关于ruby - 如何将此 SQL 结构化为 redis 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com