Оптимизация запроса Soundex для поиска похожих имен - PullRequest
3 голосов
/ 15 апреля 2010

Мое приложение предложит список предложений для английских имен, которые "звучат как" заданного введенного имени.

Запрос должен быть оптимизирован и возвращать результаты как можно быстрее. Какой вариант будет наиболее оптимальным для быстрого возврата результатов. (Или ваше собственное предложение, если у вас есть)

A. Сгенерируйте хеш Soundex и сохраните его в таблице «Имена», затем выполните что-то вроде следующего: (Это сохраняет генерацию хеша Soundex по крайней мере для каждой строки в моей базе данных на запрос, верно?)

выберите имя из имен, где NameSoundex = Soundex ('Ann')

B. Используйте функцию Разница (Это должно генерировать soundex для каждого имени в таблице?)

выбрать имя из имен, где Разница (имя, 'Энн')> = 3

C. Простое сравнение

выбрать имя из имен, где Soundex (имя) = Soundex ('Ann')

  • Мне кажется, что вариант A будет быстрее всего возвращать результаты, поскольку он генерирует Soundex только для одной строки, а затем сравнивается с индексированным столбцом «NameSoundex»

  • Опция B должна давать больше результатов, чем опция A, поскольку имя не обязательно должно совпадать с soundex, но может быть медленнее

  • Предполагая, что моя таблица может содержать миллионы строк, что даст лучшие результаты?

1 Ответ

0 голосов
/ 15 апреля 2010

вы можете предварительно вычислить РАЗНИЦУ () всех ваших имен и сохранить их в виде таблицы:

Differences
Name1
Name2
Difference


INSERT INTO Differences
        (Name1,Name2,Difference)
    SELECT
        n1.Name,n2.Name,DIFFERENCE(n1.Name,n2.Name)
        FROM Names           n1
            CROSS JOIN Names n2
        WHERE DIFFERENCE(n1.Name,n2.Name)<??? --to put a cap on what to store

и если пользователь вводит одно из ваших существующих имен, вы очень быстро получаете разницу. Если пользователь вводит имя, которого нет в вашей таблице имен, вы можете выполнить свой вариант A или B. Вы даже можете указать им «разницу» в списке выбора. Ноль будет вашим вариантом A, а любое значение будет использовать опцию B, сначала пытаясь использовать таблицу различий, а затем сканирование таблицы перебором WHERE DIFFERENCE(@givenName,Names.Name)<@UserSelectLevel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...