sql >> Database teknologi >  >> NoSQL >> Redis

Redis autofuldførelse

Hvis du har at gøre med et stort datasæt, vil jeg foreslå, at du overvejer at implementere dette som et forsøg. Jeg har smidt en lille smule Ruby sammen, der ville gøre dette:

    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)

For eksempel:

    $ 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
    []

Læs mere om Tries på Wikipedias indlæg om Tries.

Du vil helt sikkert optimere din forslagsmetode til ikke at returnere ALLE værdier, i stedet for kun at returnere de første X-værdier, den finder. Det ville besejre formålet med at gentage hele datastrukturen.



  1. Hvad er formålet med koloner i Redis-nøgler

  2. Apache HBase I/O – HFile

  3. Hvordan ændrer man rækkefølgen af ​​array med MongoDB?

  4. MongoDB $setIsSubset