Что такое быстрый и эффективный способ реализации серверного компонента для функции автозаполнения в поле ввода html?
Я пишу сервис для автозаполнения пользовательских запросов в главном окне поиска нашего веб-интерфейса, и его результаты отображаются в раскрывающемся списке с поддержкой ajax. Данные, к которым мы выполняем запросы, - это просто большая таблица концепций, о которых знает наша система, которые примерно соответствуют заголовкам страниц в Википедии. Для этого сервиса очевидно, что скорость имеет первостепенное значение, так как отзывчивость веб-страницы важна для взаимодействия с пользователем.
Текущая реализация просто загружает все концепции в память в отсортированном наборе и выполняет простой поиск по log (n) нажатию клавиши пользователя. Затем набор хвостов используется для обеспечения дополнительных совпадений за пределами ближайшего совпадения. Проблема этого решения в том, что оно не масштабируется. В настоящее время он работает в соответствии с ограничением пространства кучи виртуальной машины (я установил -Xmx2g, что является максимальным значением, которое мы можем использовать на наших 32-битных машинах), и это не позволяет нам расширять нашу концептуальную таблицу или добавлять больше функциональности. Переключение на 64-битные виртуальные машины на компьютерах с большим объемом памяти не является немедленным вариантом.
Я не решался начать работу над решением на основе диска, так как опасаюсь, что время поиска диска снизит производительность. Существуют ли возможные решения, которые позволят мне лучше масштабироваться, либо полностью в памяти, либо с помощью некоторых быстрых реализаций на диске?
редактирует:
@ Гэндальф: Для нашего случая использования важно, чтобы автозаполнение было всеобъемлющим, а не просто дополнительной помощью для пользователя. Что касается того, что мы заканчиваем, это список пар типа концепт. Например, возможными записями являются [(«Microsoft», «Компания-разработчик»), («Джефф Этвуд», «Программист»), («StackOverflow.com», «Веб-сайт»)]. Мы используем Lucene для полного поиска, когда пользователь выбирает элемент из списка автозаполнения, но я пока не уверен, что Lucene будет работать хорошо для самого автозаполнения.
@ Глен: Базы данных здесь не используются. Когда я говорю о таблице, я имею в виду структурированное представление моих данных.
@ Jason Day: Моя первоначальная реализация этой проблемы заключалась в использовании Trie , но при этом объем памяти увеличивался на самом деле, чем отсортированный набор, из-за необходимости большого количества ссылок на объекты. Я прочту о троичных поисковых деревьях, чтобы узнать, может ли это быть полезным.