如何在Redis中搜索字符串?

43

我需要一个自动完成功能。我在数据类型的属性上有短的描述性字符串。我在redis中有一组按创建日期排序的数据类型id列表,并且我使用这些id来设置和获取数据类型的属性,就像redis类型文档中所解释的那样,但是我不使用哈希表。在这种设置下,如何获得与自动完成输入框中键入的内容匹配的字符串集?每次按键都遍历所有id并检查要搜索的属性似乎是错误的方法。

编辑: 除了下面的答案外,我还看到了这个网址:

http://antirez.com/post/autocomplete-with-redis.html

4个回答

16

您需要使用集合或有序集合来设置索引,并在保存任何内容时将其写入其中。

这篇文章讲解得非常详细,几乎和我自己使用的方式一样。


1
很遗憾,链接已经失效了,所以我找到了另一篇好文章 - RienNeVaPlu͢s
9
每个失落的网站,都有网络档案馆。 - Hawili
你不能使用Lua及其模式匹配来搜索字符串吗? - Private

6
在Redis中,没有办法搜索键的值。你唯一能够“找到”一个字符串的方法是通过keys命令。唯一的缺点是它只搜索键名,而不是值。你可以绕过这个问题,将搜索字符串作为键,并将该键的值作为你的ID。我在我的网站上使用了自动完成功能,我还使用另一个数据库,其中只包含搜索字符串,并将其ID作为值。

不,它们都是Redis。数据库#3和#4。 - Colum
啊,如果我想使用redis-cluster,多个数据库是行不通的。我猜我可以尝试另一个redis进程。 - Bjorn
2
更新一下:Redis 命令 SCAN、HSCAN、ZSCAN 和 SSCAN 也支持 KEYS 的 MATCH 模式搜索语法,但是在 http://redis.io/commands/keys 上有一个相当令人生畏的警告,不建议在生产环境中使用它。 - Matthias Winkelmann

3
您可以尝试使用RediSearch。它是一个Redis模块,为Redis提供查询、二级索引和全文搜索功能。它使用压缩的倒排索引进行快速索引,并且内存占用低。它的索引增强了Redis,提供了精确短语匹配、模糊搜索和数字过滤等许多功能。

redisearch-stars


0

Redis本身不支持此功能。我们修改了Redis的源代码,使其能够支持全文搜索、字符串搜索以及一些求和和平均值的计算。

项目主页:http://oncedb.com

全文搜索

OnceDB支持直接搜索,支持String和Hash等对象。

搜索字符串:搜索模式 运算符 值

使用SEARCH命令。

# Create data
set test1 'this is testing'
> OK
set test2 'this is article'
> OK

# Search data
search test* ~ article
1) test1
2) this is testing
3) test2
4) this is article

操作符支持:

= Exact match
~ Partial match
> >= < <= Compare match

搜索哈希表:hsearch 模式字段运算符值...

使用 hsearch 命令

Redis 中没有“表”的概念。通常,键名使用 schema:id 包括表名和主键。例如,user:001 是一个哈希对象,包含一个用户表和一个主键值为 001。

# Create hash data
hmset user:001 name kris email c2u@live.cn gender male age 16
> OK
hmset user:002 name sunny age 24
> OK

# Search hash data
hsearch user:* age > 18 name = *
1) user:002
2) 24
3) sunny

搜索有序列表(zset): zhsearch key from to schema field operator value ...

不要直接使用test:*或user:*的模式匹配,因为这会遍历所有键,性能较低。zhsearch可以在有序列表中搜索相应的主键,并指定搜索范围。

在上面的示例中,我们将用户的主键值存储到*user有序列表中,分数是关于时间的整数。

zadd *user 20020201 001 20020202 002

查找第一个匹配的数据(从0到0)

zhsearch *user 0 0 user: age > 10
1) -1
2) user:001
3) 16

使用全文搜索时,返回的第一个参数始终为-1。

OnceDB不改变Redis的数据存储结构。 Redis数据库文件可以直接在OnceDB中操作,然后返回给Redis使用。

索引查询

全文搜索的性能较差。您可以通过创建索引来提高性能。

OnceDB可以选择在修改数据时自动创建辅助索引。

详细信息可参考此答案

Redis和查询值


此答案不适用于Redis。 - Brian Hannay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接