Предполагая, что база данных довольно статична, используйте фильтр bloom . Это вырожденная форма хеш-таблицы, в которой хранятся только биты, указывающие на наличие значения, без сохранения самого значения. Это вероятностный случай, поскольку хэши могут сталкиваться, поэтому для каждого попадания потребуется полный поиск. Но фильтр блума 1 МБ с 500 000 записей может иметь всего 0,03% ложных срабатываний.
Немного математики: Для получения этой низкой скорости требуется до 23 хэш-кодов, каждый из которых имеет 23 бита энтропии, в общей сложности 529 бит. 64-битная хеш-функция Боба Дженкинса генерирует 192 бита энтропии за один проход (если вы используете незарегистрированные переменные в hash()
, которые Боб называет «ОК», как «посредственный» хеш) требуется максимум три прохода. Из-за того, как работают фильтры Блума, вам не нужна вся энтропия в каждом запросе, так как большинство поисков сообщит о пропусках задолго до того, как перейти к 23-му хэш-коду.
РЕДАКТИРОВАТЬ: Вам, очевидно, придется разбирать слова из текста. Поиск каждого экземпляра /\b\w+\b/
, вероятно, подойдет для первой версии.
Чтобы сопоставить фразы, вам нужно будет проверить каждую подпоследовательность n -слов (aka n -грамм), где n - это каждое число от 2 до самой большой фразы в вашем словаре. Вы можете сделать это намного дешевле, добавив любое слово, которое появляется в фразе, в отдельный фильтр Блума и протестировав n -грамм, для которых каждое слово проходит этот второй фильтр.