【问题标题】:Phrase matching for keys in redisredis中键的短语匹配
【发布时间】:2017-04-14 12:59:16
【问题描述】:

我在 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 个结果。

【问题讨论】:

    标签: redis pattern-matching glob


    【解决方案1】:

    我不相信这可以通过 glob 样式的模式来实现。

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

    来自文档

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

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

    --

    选项 1

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

    选项 2

    根据您要寻找的保证类型和您拥有的数据量,您可以使用 KEYS。这通常不是推荐的方法,但可以考虑。

    示例: KEYS '*136 mountain*'

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

    选项 3

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

    选项 4

    编写一个 Lua 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多