我需要一个自动完成功能。我在数据类型的属性上有短的描述性字符串。我在redis中有一组按创建日期排序的数据类型id列表,并且我使用这些id来设置和获取数据类型的属性,就像redis类型文档中所解释的那样,但是我不使用哈希表。在这种设置下,如何获得与自动完成输入框中键入的内容匹配的字符串集?每次按键都遍历所有id并检查要搜索的属性似乎是错误的方法。
编辑: 除了下面的答案外,我还看到了这个网址:
我需要一个自动完成功能。我在数据类型的属性上有短的描述性字符串。我在redis中有一组按创建日期排序的数据类型id列表,并且我使用这些id来设置和获取数据类型的属性,就像redis类型文档中所解释的那样,但是我不使用哈希表。在这种设置下,如何获得与自动完成输入框中键入的内容匹配的字符串集?每次按键都遍历所有id并检查要搜索的属性似乎是错误的方法。
编辑: 除了下面的答案外,我还看到了这个网址:
您需要使用集合或有序集合来设置索引,并在保存任何内容时将其写入其中。
这篇文章讲解得非常详细,几乎和我自己使用的方式一样。
keys
命令。唯一的缺点是它只搜索键名,而不是值。你可以绕过这个问题,将搜索字符串作为键,并将该键的值作为你的ID。我在我的网站上使用了自动完成功能,我还使用另一个数据库,其中只包含搜索字符串,并将其ID作为值。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 命令
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
不要直接使用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可以选择在修改数据时自动创建辅助索引。
详细信息可参考此答案