redis中密钥的短语匹配

时间:2016-11-30 09:18:24

标签: redis pattern-matching glob

我在redis中有以下键:

"542 136 mountain road"
"542 136 mountainview road"
"542136 mountain road"
"542 136 mountain"
"136 mountain road"
"136 mountain"

我想获取包含短语136 mountain的键。 使用glob样式模式,我目前正在进行4次查询,以满足所有可能的情况。

scan 0 MATCH '*[\ ]136 mountain[\ ]*'

scan 0 MATCH '*[\ ]136 mountain'

scan 0 MATCH '136 mountain[\ ]*'

scan 0 MATCH '136 mountain'

这四个查询总共会返回4个结果:

"542 136 mountain road"
"542 136 mountain"
"136 mountain road"
"136 mountain"

如果有更好的方式更改模式字符串,请分享您的输入,以便可以在一个查询中获得所有4个结果。

1 个答案:

答案 0 :(得分:0)

我不相信这可以通过水钻风格来实现。

我还要注意,即使存在与所呈现的短语匹配的模式,由于SCAN的工作原理,您需要遍历整个数据集(进行单独调用)以获得您要查找的结果。然后,您需要考虑在迭代期间您的数据可能会发生变化的事实。

来自文档

  

重要的是要注意MATCH过滤器之后应用   在返回数据之前,从集合中检索元素   给客户。这意味着如果模式匹配很少   集合中的元素,SCAN可能不会返回任何元素   大多数迭代。

参考:https://redis.io/commands/scan#the-match-option

-

选项1

使用 SCAN 遍历整个数据集,并进一步过滤应用程序级别的数据。

选项2

根据您要查找的保证类型以及您拥有的数据量,您可以使用 KEYS 。这通常不是推荐的方法,但它是一个可以考虑的选择。

实施例: KEYS '*136 mountain*'

SCAN 方法非常相似,您将获得比您正在寻找的更大的响应,并且需要使用您选择的语言来进一步过滤结果。

选项3

通过在应用程序级别执行一些预处理来索引数据。如果键与您想要的模式匹配,请将其添加到 SET / 排序集

选项4

写一个Lua脚本。