sql >> Databáze >  >> NoSQL >> Redis

Automatické doplňování Redis

Pokud máte co do činění s velkým souborem dat, navrhoval bych zvážit jeho implementaci jako pokus. Dal jsem dohromady malý kousek Ruby, který by udělal toto:

    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)

Například:

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

Přečtěte si více o Tries v příspěvku Wikipedie o Tries.

Určitě budete chtít optimalizovat svou metodu návrhu tak, aby nevracela VŠECHNY hodnoty, ale pouze prvních X hodnot, které najde. Zmařilo by to účel iterovat celou datovou strukturu.



  1. vnořená výjimka je redis.clients.jedis.exceptions.JedisConnectionException:Nelze získat zdroj z fondu

  2. Existuje nějaký způsob, jak obnovit nedávno smazané dokumenty v MongoDB?

  3. Výukový program Hadoop MapReduce pro začátečníky

  4. Jaký je smysl REDIS v zásobníku ELK?