sql >> データベース >  >> NoSQL >> Redis

Redisオートコンプリート

    大規模なデータセットを扱っている場合は、これをトライとして実装することを検討することをお勧めします。これを行うRubyを少しまとめました:

        require 'rubygems'
        require 'redis'
        
        class RedisTrie
          TERMINAL = '+'
        
          def initialize(prefix)
            @prefix = prefix
            @r = Redis.new
          end
        
          def add_word(word)
            w = word.gsub(/[^a-zA-Z0-9_-]/, '')
            key = "#{@prefix}:"
        
            w.each_char do |c|
              @r.zset_add key, c.bytes.first, c
              key += c
            end
        
            @r.zset_add key, 0, TERMINAL
          end
        
          def add_words(*words)
            words.flatten.compact.each {|word| add_word word}
          end
        
          def suggest(text)
            @r.zset_range("#{@prefix}:#{text}", 0, -1).map do |c|
              (c == TERMINAL) ? text : suggest(text + c)
            end.flatten
          end
        end
        
        rt = RedisTrie.new('trie')
        
        rt.add_words %w( apple automobile carwash oil-change cranky five ruthie axe auto )
        
        p rt.suggest(ARGV.shift.to_s)
    

    例:

        $ ruby RedisTrie.rb
        ["apple", "auto", "automobile", "axe", "carwash", "cranky", "five", "oil-change", "ruthie"]
        $ ruby RedisTrie.rb a
        ["apple", "auto", "automobile", "axe"]
        $ ruby RedisTrie.rb au
        ["auto", "automobile"]
        $ ruby RedisTrie.rb aux
        []
    

    Triesに関するウィキペディアのエントリでTriesの詳細をご覧ください。

    提案メソッドを最適化して、すべての値を返さず、最初に見つかったX値のみを返すようにすることをお勧めします。データ構造全体を反復するという目的は無効になります。



    1. 外部インジェクション攻撃からMongoDBを保護する

    2. サブドキュメントをMongoDBのルートレベルにフラット化するにはどうすればよいですか?

    3. PHPがMongoDBドライバーを見つけることができません

    4. ubuntuのデフォルトポート6379とは異なるポートでredis-serverを起動する方法