Автоматическое заполнение Redis

Как я могу реализовать автоматическое заполнение с помощью советов?

Скажите, например, что у меня есть массив ["alfred","joel","jeff","addick"]. Когда я ввожу a Я добираюсь ["alfred", "addick"]

Я надеюсь, что Вы понимаете. Как я могу реализовать это использование команды советов эффективно (если возможный, но я думаю, что это). Было бы замечательно, если я мог бы получить некоторые простые команды, я могу испытать через telnet для имитации этого поведения.

Спасибо

P.S.: С Рождеством всем Вам:)

20
задан Alfred 24 December 2009 в 11:35
поделиться

2 ответа

Если вы имеете дело с большим набором данных, то я бы предложил рассматривать реализацию этого как триединство. Я собрал небольшой кусочек Рубина, который бы сделал это:

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

Читайте подробнее о попытках в Википедии в статье о попытках.

Вы определенно захотите оптимизировать предложенный вами метод, чтобы не возвращать ВСЕХ значений, а только возвращать первые X-значения, которые он найдет. Это аннулирует цель итерации всей структуры данных.

.
19
ответ дан 29 November 2019 в 23:48
поделиться

Я также нашел этот фрагмент, когда читал впечатляющее учебное пособие по Redis Саймона Уиллисона .

Решение:

Привет, Макс,

KEYS - это не лучший вариант. Лучшее , что вы можете сделать, - это использовать вместо него отсортированный набор. Вы хотите превратить первые 4 или 5 символов строк в целое число (вы можете представить каждый символ как цифру системы счисления Например, число 256, но там лучше представление) и добавьте все ваши имена пользователей в отсортированный набор.

Затем с помощью ZRANGEBYSCORE вы можете получить все элементы в заданном диапазоне .

Этот метод гораздо более масштабируемый, поскольку он имеет значение O (log (N)).

Я рассказываю об этом в моей очень медленно развивающейся книге Redis ...

Ура, Сальваторе

6
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: