我在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个结果。
答案 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脚本。