У меня есть следующее требование: -
У меня много (скажем, 1 миллион) значений (имен). Пользователь вводит строку поиска.
Я не ожидаю, что пользователь правильно напишет имена.
Итак, я хочу сделать что-то вроде Google «Вы имели в виду». Это перечислит все возможные значения из моего хранилища данных. Есть похожий, но не тот же вопрос здесь. Это не ответило на мой вопрос.
Мой вопрос: - 1) Я считаю, что хранить эти данные в СУБД не рекомендуется. Потому что тогда у меня не будет фильтра по SQL-запросам. И мне нужно провести полное сканирование таблицы. Итак, в этой ситуации, как следует хранить данные?
2) Второй вопрос совпадает с это. Но просто для полноты моего вопроса: как мне выполнять поиск в большом наборе данных? Предположим, в наборе данных есть имя Фрэнки. Если пользователь набирает Фрэнки, как мне найти Фрэнки? Мне нужно перебрать все имена?
Я наткнулся на Расстояние Левенштейна, которое будет хорошим методом для поиска возможных строк. Но опять же, мой вопрос: должен ли я работать со всеми 1 миллионом значений из моего хранилища данных?
3) Я знаю, Google делает это, наблюдая за поведением пользователей. Но я хочу сделать это, не наблюдая за поведением пользователя, то есть используя, я еще не знаю, алгоритмы расстояния. Потому что первый метод потребует для начала большого объема поисков!
4) Как указал Кирк Бродхерст в ответе ниже, есть два возможных сценария: -
- Пользователи ошибаются при вводе слова (алгоритм расстояния редактирования)
- Пользователи, не знающие слова и угадывающие (алгоритм фонетического сопоставления)
Меня интересует и то, и другое. На самом деле это две разные вещи; например Шон и Шон звучат одинаково, но имеют расстояние редактирования 3 - слишком большое, чтобы считаться опечаткой.