redis中密钥的短语匹配

Shi*_*MSK 5 glob pattern-matching redis

我在redis中有以下键:

"542 136 mountain road"
"542 136 mountainview road"
"542136 mountain road"
"542 136 mountain"
"136 mountain road"
"136 mountain"
Run Code Online (Sandbox Code Playgroud)

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

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

scan 0 MATCH '*[\ ]136 mountain'

scan 0 MATCH '136 mountain[\ ]*'

scan 0 MATCH '136 mountain'
Run Code Online (Sandbox Code Playgroud)

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

"542 136 mountain road"
"542 136 mountain"
"136 mountain road"
"136 mountain"
Run Code Online (Sandbox Code Playgroud)

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

dav*_*p14 0

I don't believe this can be achieved with a glob-style pattern.

I would also note that even if there was a pattern that matched the phrases presented, due to the nature of how SCAN works you would need to iterate through the entire dataset (making separate calls) to get the results you are looking for. Then you would need to consider the fact your data may be changing during the iteration period.

From the docs

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

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

--

选项1

使用SCAN迭代整个数据集,并在应用程序级别进一步过滤数据。

选项2

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

例子: KEYS '*136 mountain*'

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

选项3

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

选项4

编写一个Lua脚本。