Redis全文搜索:反向索引还是太阳黑子?

时间:2013-06-16 13:30:38

标签: redis sunspot

我有3.5百万条记录(readonly)实际存储在MySQL数据库中,出于性能原因,我想将其提取给Redis。实际上,我已经设法将这样的东西存储到Redis中:

1 {"type":"Country","slug":"albania","name_fr":"Albanie","name_en":"Albania"}
2 {"type":"Country","slug":"armenia","name_fr":"Arménie","name_en":"Armenia"}
...

我在这里使用的密钥是遗留的MySQL id,所以使用一些Ruby胶水,我可以在现有应用程序中尽可能少地破解(这是一个严重的问题)。

现在问题是当我需要在值部分内搜索关键字“Armenia”时。似乎只有两种出路:

我可以将Redis索引

我使用太阳黑子或一些全文搜索引擎(不幸的是,我实际上使用的是与MySQL过于依赖的ThinkingSphinx: - (

那么,你会做什么?你认为MySQL to Redis移动单个表是一个好主意吗?我担心这些巨大的Redis密钥/值可能占用16GB RAM服务器的内存占用。

有关类似Redis用法的任何反馈意见?

3 个答案:

答案 0 :(得分:4)

在我开始真正回答之前,我想提一下,我没有看到你在这里使用Redis的充分理由。根据您尝试做的事情类型,听起来elasticsearch之类的内容更适合您。

也就是说,如果您只想在JSON中搜索几个不同的字段,那么您有两个选择:

  1. 指向field_key -> list_of_ids的辅助索引(在您的情况下,"亚美尼亚" - > 1)。
  2. 在Redis上使用Lua并使用JSON编码和解码来获得您想要的内容。这种方式更灵活,节省空间,但随着桌面的增长速度会变慢。
  3. 同样,我不认为哪一个适合你,因为听起来Redis不是一个很好的选择,但是如果你必须,那些应该有效。

答案 1 :(得分:2)

这是我对Redis的看法。 基本上我认为它是一个内存缓存,可以配置为只存储最近最少使用的数据(LRU)。我在用例中扮演的角色是什么,其逻辑可能适用于帮助您思考您的用例。

我目前正在使用Redis根据一些复杂查询(慢速)缓存搜索引擎的结果,由另一个数据库中的数据支持(类似于您的情况)。因此Redis充当用于回答查询的缓存存储。如果Redis中的缓存未命中,则所有查询都将在Redis或数据库中提供数据。所以,请注意Redis并没有取代数据库,而只是在我的情况下通过缓存扩展。 这符合我的特定用例,因为Redis的添加应该有助于未来的可扩展性。我们的想法是重复访问最近的数据(在我的情况下,如果用户进行重复查询)可以由Redis提供服务,并减轻数据库的负担。

基本上我的Redis架构看起来有点像你上面列出的索引的重复。我使用sets和sortedSets来创建redis-keys的“批次/集合”,每个redis-keys指向存储在特定redis-key下的特定查询结果。在DB中,我仍然拥有完整的数据集和索引。

如果您的数据集适合RAM,您可以在Redis中执行“表转储”,并且不再需要MySQL。只要您计划持久的Redis存储并计划可能的数据增长,如果此“表”将来会增长,我就能看到这种方法有效。

因此,根据您的实际使用情况以及您如何看待Redis适合您的堆栈以及数据库所服务的负载,不排除必须执行上述两个选项的可能性(发生在我的情况)。

希望这有帮助!

答案 2 :(得分:0)

Redis确实提供了RediSearch的全文搜索。

Redisearch在Redis之上实现了一个搜索引擎。这还启用了更高级的功能,例如精确的词组匹配,自动建议和用于文本查询的数字过滤,这是传统的Redis搜索方法无法实现或无法实现的。