【问题标题】:Can Redis do prefix matching?Redis 可以做前缀匹配吗?
【发布时间】:2012-02-27 18:07:55
【问题描述】:

假设我在世界上有一组这样的城市:

EUKLOND
EUKMANC
EUKEDIN
EITROME
EITMILA
EITNAPE
EFRPARI
EFRAVIG
EFRBRES

第一个字母是大陆,接下来的两个是国家,后面的 4 是缩写的城市名称。

我希望能够通过传入“E”来搜索此集合,这将返回所有条目或 EIT,并检索意大利或 EFPARI 的所有条目并仅获取巴黎条目。

这是我可以用 Redis 做的事情吗?

【问题讨论】:

    标签: redis


    【解决方案1】:

    一般来说,这是一个自动完成的场景。

    Salvatore Sanfilippo (@Antirez),Redis 的作者,写了一封thorough blog post 来说明如何实现这一点。

    更新:我刚刚看到另一个很棒的blog post,它首先采用了 Salvatore 的解决方案并以清晰的方式进行了解释,然后提供了另一种也适用于多词短语的解决方案。

    【讨论】:

    • 感谢 Ofer,我已经阅读了这篇文章,但我似乎无法弄清楚作者是如何得出的:“zrange zset 6 -1”。他怎么知道他需要做一个 6 -1 切片?如果我在欧洲国家有不同数量的城市,我如何计算 "zrange zset X -1" 中的 X?
    • 首先,他通过运行zrank zset fo查询fo在哪里。他得到了答案5。然后,他询问从6(5+1)到结束的所有项目。他运行zrange zset 6 -1。当你使用负数时,它意味着“从头到尾”。 -1 表示“排序集的最后一个元素”(参见redis documentation)。
    • 是的,这就是我的假设。从“fo”到“列表末尾”对我来说不是可行的方法。上面的数据集只是一个例子。我真的负担不起从某个任意点一直返回到集合的末尾,因为这可能是大量数据(集合可以容纳约 40 亿个 IRC 项)。
    • Antirez 稍后在他的帖子中谈到了这一点:“幸运的是,流算法可以帮助我们。我们知道,即使在统计上,例如,每个前缀仅取 300 个项目,我们也将能够获得非常前五项的近似值,因为如果一个查询足够频繁,它最终会胜过其他查询。”
    • 您应该以不同于关系数据库或专用搜索服务器的方式看待 Redis。它快如闪电,您必须意识到重复查询绝对没问题——它仍然比其他任何事情都快得多。例如,每次重复 50 块直到你发现你超出了你的范围在 Redis 中是完全可以的。我花了一些时间来摆脱“经典”的习惯和想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2022-01-24
    • 2019-01-09
    • 2019-01-11
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多