如何在 Redis 中进行模糊搜索

Posted

技术标签:

【中文标题】如何在 Redis 中进行模糊搜索【英文标题】:How to do a fuzzy search in Redis 【发布时间】:2013-10-24 16:47:52 【问题描述】:

我想在 Redis 中做一个模糊搜索

我有很多域 IP 信息要维护,我想使用哈希来保存它们

Domain-IP的结构是这样的:

域名-IP

域名

ip

last-access(上次我用这个ip访问域)

访问次数

...

现在我想做两件事:

    按域搜索此 Domain-IP 信息,例如:select * from domain-ip where domain = "www.google.com"

    按域和 IP 更新 Domain-IP 信息,例如:更新 domain-ip set access-count = access-count + 1 where domain = "www.google.com" and ip = "192.168.1.1 "

所以我设计 Redis 中的结构是:

HSET domainip.www.google.com.192.168.1.1 access-count 20

HSET domainip.www.google.com.192.168.1.2 access-count 20

所以我可以像这样按域搜索它们,例如,搜索有关 www.google.com 的信息:

    通过以下方式获取所有以 www.google.com 开头的密钥:keys domainip.www.google.com* 使用这些键循环获取有关 google 的所有信息:
for (string key : keys) 
   execute("HGETALL " + key) // then convert the hash into a POJO

更新操作如下:

“HSET 域ip。” + domainStr + "." + ipStr + "访问计数" + 新访问计数;

“HSET 域ip。” + domainStr + "." + ipStr + "最后一次访问" + 新的最后访问;

我的问题是:

    循环是否会导致性能问题?

    是否有权逐个更新hash文件?

如果你能提供一个好主意来完成我想要在 Redis 中完成的操作,那就太好了,谢谢:D

【问题讨论】:

【参考方案1】:

不建议将密钥用于生产用途(请参阅http://redis.io/commands/keys)。我的第一直觉是,您实际上想要一个 SQL 数据库,Redis 不会像您描述的那样对数据进行任意切片。

如果您出于某种原因确实需要使用 redis,则需要维护一堆索引以供访问。基本上,您要使用的每个“where 子句”都将获得一个集合(或排序集合,如果您需要特定的排序),维护与该键匹配的哈希列表。因此,例如,如果您有哈希

domainip.www.google.com.192.168.1.1
domainip.www.google.com.192.168.1.2
domainip.www.yahoo.com.192.168.1.4

你会创建索引集:

by_domain:www.google.com => (
         domainip.www.google.com.192.168.1.1,
         domainip.www.google.com.192.168.1.2
)
by_domain:www.yahoo.com => (
         domainip.www.yahoo.com.192.168.1.4
)

其中集合的值是哈希的键,集合的键是<column>:<value> 格式的查询。在添加和删除哈希键时,您需要维护这些索引。

【讨论】:

以上是关于如何在 Redis 中进行模糊搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PDO 中使用绑定参数进行模糊搜索?

如何进行模糊查找文件

如何使用 Lodash java-script 库进行模糊搜索?

如何在大数据中进行模糊搜索

搜索框实现模糊查询方法 - js

(Swift) 如何对 Core Data 进行模糊搜索?