【问题标题】:How do I search strings in redis?如何在redis中搜索字符串?
【发布时间】:2021-06-21 01:50:11
【问题描述】:

我想要一个自动完成功能。我在 a 上有简短的描述性字符串 数据类型的属性。我在 redis 中有一个 id 列表 按创建日期排序的数据类型,我使用 id 来设置和获取 数据类型的属性,如 redis 类型中所述 文档。我不使用哈希表。什么是最好的获得方式 与输入到自动完成输入中的内容匹配的一组字符串 给定这个设置的盒子?遍历所有 id 并检查属性 我想搜索 - 每次击键似乎都是错误的方式 这个。

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

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    您需要使用在保存任何内容时写入的集合或排序集合来设置索引。

    http://web.archive.org/web/20121013063245/http://playnice.ly/blog/2010/05/05/a-fast-fuzzy-full-text-index-using-redis 有一篇很好的文章,与我自己使用的非常接近。

    【讨论】:

    【解决方案2】:

    在 Redis 中,无法搜索键的值。您可以“找到”字符串的唯一方法是通过keys 命令。唯一的缺点是它搜索键名,而不是值。解决此问题的方法是将搜索字符串作为键,然后将所述键的值作为您的 ID。我在我这边使用了一个自动完成功能,我使用了另一个数据库,它只包含搜索字符串,并将 ID 作为值。

    【讨论】:

    • 不,它们都是 Redis。数据库 #3 和 #4
    • 啊,如果我想使用redis-cluster,多个数据库将无法工作。我想我可以尝试另一个 redis 进程。
    • 作为更新:Redis 命令 SCAN、HSCAN、ZSCAN 和 SSCAN 也支持 KEYS 的 MATCH 模式搜索语法,但在 redis.io/commands/keys 有一个非常吓人的警告,不要在生产中使用它。跨度>
    【解决方案3】:

    你可以试试RediSearch
    它是一个 Redis 模块,为 Redis 提供查询、二级索引和全文搜索。

    它使用压缩的倒排索引进行快速索引,内存占用少。
    它的索引通过提供精确短语匹配、模糊搜索和数字过滤以及许多其他功能来增强 Redis。

    【讨论】:

      【解决方案4】:

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

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

      全文搜索

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

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

      使用搜索命令

      # 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:*模式匹配,因为会遍历所有key,性能低。 zhsearch可以在有序列表中搜索对应的主键,并指定搜索范围。

      在上面的例子中,我们将user的主键值存储到*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 and Querying Values

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 2017-12-16
        • 2019-05-06
        • 2012-01-01
        相关资源
        最近更新 更多