如何将这个 SQL 构造成 redis 数据库
how to structure this SQL into a redis database
我在理解如何将此 SQL 数据库转换为 Redis 数据库时遇到一些问题。它是一个一对多的数据库,由关键字、响应和两者的相关性 table 到 link 组成。
在关键词table中我有:
|ID---Keyword|
1 This
2 Cool
在回复中table我有
|ID---Response|
1 "I agree"
2 "wow"
在相关性中 table 我有:
|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 获取响应字符串。请注意,我需要首先获得与最多关键字匹配的数据 return 响应,因此如果 "This"、"Cool" 给出响应 "I agree",尽管如果仅给出关键字 "Cool" "wow" 并且将检索 "I agree"。
这样做的目的是,当指定的关键字越多时,针对这些关键字的响应就越具体。关键词越少,越有可能成为一般性的回应。从上面可以看出,当指定两个关键字时,只有一个响应,而当指定一个关键字时,有两个响应。 如果可能的话,如果我能从匹配最多的关键字到最少匹配的关键字对这些结果进行排序,这也会很有帮助。
关于 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 数据库中是否有足够的数据来实现这一点。鉴于上述结构,数据就在那里,但您需要决定 how/where 您想要计算给定关键字列表的响应计数。您可以编写一个 lua 脚本到 return 一个从最匹配到最少匹配的关键字的排序列表,该列表将在 redis 客户端上执行。您还可以接收 redis 集并从 ruby.
计算该信息
你应该看看 Sets 的 redis 文档:
如果您想找到许多关键字之间的响应重叠,命令 SINTER 可能会派上用场。
更新:
我认为最简单的做法是将所有回复放在 lua 中的一个大 table 中,然后 return table 回复及其计数。 E.x:
k1 => r1, r2, r3
k2 => r1, r2
k3 => r1, r3
在这种情况下,我们最终会 returning:
r1: 3
r2: 2
r3: 2
然后您可以使用该 table 来确定如何处理您的结果。下面是一些 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
我在理解如何将此 SQL 数据库转换为 Redis 数据库时遇到一些问题。它是一个一对多的数据库,由关键字、响应和两者的相关性 table 到 link 组成。
在关键词table中我有:
|ID---Keyword|
1 This
2 Cool
在回复中table我有
|ID---Response|
1 "I agree"
2 "wow"
在相关性中 table 我有:
|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 获取响应字符串。请注意,我需要首先获得与最多关键字匹配的数据 return 响应,因此如果 "This"、"Cool" 给出响应 "I agree",尽管如果仅给出关键字 "Cool" "wow" 并且将检索 "I agree"。
这样做的目的是,当指定的关键字越多时,针对这些关键字的响应就越具体。关键词越少,越有可能成为一般性的回应。从上面可以看出,当指定两个关键字时,只有一个响应,而当指定一个关键字时,有两个响应。 如果可能的话,如果我能从匹配最多的关键字到最少匹配的关键字对这些结果进行排序,这也会很有帮助。
关于 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 数据库中是否有足够的数据来实现这一点。鉴于上述结构,数据就在那里,但您需要决定 how/where 您想要计算给定关键字列表的响应计数。您可以编写一个 lua 脚本到 return 一个从最匹配到最少匹配的关键字的排序列表,该列表将在 redis 客户端上执行。您还可以接收 redis 集并从 ruby.
计算该信息你应该看看 Sets 的 redis 文档:
如果您想找到许多关键字之间的响应重叠,命令 SINTER 可能会派上用场。
更新:
我认为最简单的做法是将所有回复放在 lua 中的一个大 table 中,然后 return table 回复及其计数。 E.x:
k1 => r1, r2, r3
k2 => r1, r2
k3 => r1, r3
在这种情况下,我们最终会 returning:
r1: 3
r2: 2
r3: 2
然后您可以使用该 table 来确定如何处理您的结果。下面是一些 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