Skip to content

Instantly share code, notes, and snippets.

@antirez
Created September 10, 2010 17:35
Show Gist options
  • Star 31 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save antirez/574044 to your computer and use it in GitHub Desktop.
Save antirez/574044 to your computer and use it in GitHub Desktop.
# compl1.rb - Redis autocomplete example
# download female-names.txt from http://antirez.com/misc/female-names.txt
require 'rubygems'
require 'redis'
r = Redis.new
# Create the completion sorted set
if !r.exists(:compl)
puts "Loading entries in the Redis DB\n"
File.new('female-names.txt').each_line{|n|
n.strip!
(1..(n.length)).each{|l|
prefix = n[0...l]
r.zadd(:compl,0,prefix)
}
r.zadd(:compl,0,n+"*")
}
else
puts "NOT loading entries, there is already a 'compl' key\n"
end
# Complete the string "mar"
def complete(r,prefix,count)
results = []
rangelen = 50 # This is not random, try to get replies < MTU size
start = r.zrank(:compl,prefix)
return [] if !start
while results.length != count
range = r.zrange(:compl,start,start+rangelen-1)
start += rangelen
break if !range or range.length == 0
range.each {|entry|
minlen = [entry.length,prefix.length].min
if entry[0...minlen] != prefix[0...minlen]
count = results.count
break
end
if entry[-1..-1] == "*" and results.length != count
results << entry[0...-1]
end
}
end
return results
end
complete(r,"marcell",50).each{|res|
puts res
}
@djanowski
Copy link

Started to extract and cleanup a bit: http://github.com/djanowski/replete

@j4mie
Copy link

j4mie commented Sep 15, 2010

Quick line-by-line (ish) port to Python: http://gist.github.com/577852

@girishso
Copy link

What is the advantage over loading the entries in memory (as a ruby constant) and use that constant for autocompletion? Assuming redis will hold the entries in memory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment