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