sql >> Databasteknik >  >> NoSQL >> Redis

Redis autocomplete

Om du har att göra med en stor datamängd skulle jag föreslå att du överväger att implementera detta som ett försök. Jag har slängt ihop en liten bit av Ruby som skulle göra detta:

    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)

Till exempel:

    $ 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 mer om Försök på Wikipedias inlägg om Försök.

Du kommer definitivt att vilja optimera din förslagsmetod för att inte returnera ALLA värden, istället bara returnera de första X-värdena den hittar. Det skulle motverka syftet att iterera hela datastrukturen.



  1. Meteor använda hämta eller hitta i mallhjälpfunktioner?

  2. Förbereder en MongoDB-server för produktion

  3. Hur man installerar Apache CouchDB på CentOS 8

  4. Få Set value från Redis med RedisTemplate