Если вы не против введения Redis в микс, взгляните на https://github.com/seatgeek/soulmate - из README:
Soulmate - это инструмент, помогающий решить общую проблему разработкифункция быстрого автозаполнения.Он использует отсортированные наборы Redis для построения индекса частично заполненных слов и соответствующих элементов, соответствующих наиболее подходящим элементам, и предоставляет простое приложение sinatra для их запроса.Soulmate заканчивает ваши предложения.
Soulmate был разработан, чтобы быть простым и быстрым, и предлагает следующее:
- Предоставляет предложения для нескольких типов элементов в одном запросе (в SeatGeek мыповторное автозаполнение для исполнителей, событий и мест)
- Результаты упорядочены по заданному пользователем счету
- Произвольные метаданные для каждого элемента (в SeatGeek мы храним и URL, и субтитры)
Элемент - это простой объект JSON, который выглядит следующим образом:
{
"id": 3,
"term": "Citi Field",
"score": 81,
"data": {
"url": "/citi-field-tickets/",
"subtitle": "Flushing, NY"
}
}
Где id
- уникальный идентификатор (в пределах определенного типа), term
- фразавы хотите предоставить дополнения для, score
- указанная пользователем метрика ранжирования (redis упорядочит лексикографически для элементов с одинаковым счетом), а data
- дополнительный контейнер для метаданных, которые вы хотите вернуть, когда этот элементсовпадает (в SeatGeek мы включили URL-адрес для элемента, а также субтитр, когда мы представляем его в раскрывающемся списке автозаполнения).
См. Soulmate in action в SeatGeek .
Если ничего другого, возможно, это даст вам некоторые идеи о том, как структурировать данные таким образом, который имеет смысл.
Я сделалне писать или иметь какое-либо отношение к родственной душе.Это просто библиотека, которую я обнаружил, пытаясь решить подобную проблему.Надеюсь, это поможет!