Используйте SOUNDEX() слово за словом на SQL Server

Здесь моя проблема. Например, у меня есть таблица Products, которая содержит поле Name:

Products
ID | Name | ..
1  | "USB Key 10Go"
2  | "Intel computer"
3  | "12 inches laptop computer"
...

В настоящее время я внедряю простую поисковую систему (SQL Server и ASP .NET, C#) для веб-приложения для iPhone, и я хотел бы использовать SOUNDEX() Функция SQL Server.

Дело в том, что я не могу напрямую использовать SOUNDEX в поле Имя. (Это не имеет значения, так как в названии есть несколько слов.) Я хотел бы применить SOUNDEX Функция для каждого слова из поля имени, а затем посмотреть, соответствует ли любое из них исследуемому ключевому слову.

Если кто-то знает, как это сделать, это было бы здорово.

5 ответов

Решение

Вы изучили функцию полнотекстового поиска в SQL Server? Я знаю, что это не совсем то, что вы просили. Просто функция SOUNDEX() используется для поиска похожих имен SOUNDING (EX: SMITH и SMYTHE звучат одинаково). Однако в поисковой системе то, как звучит слово, менее важно, чем сами поисковые слова. Полнотекстовый поиск также позволяет использовать синонимы (позволяя указывать определенные слова, которые означают одно и то же в контексте вашего приложения), и автоматически учитывать их во время поиска.

Посмотрите на эти страницы для получения дополнительной информации о полнотекстовом поиске в SQL Server:

Введение в полнотекстовый поиск

СОДЕРЖИТ

CONTAINSTABLE

СВОБОДНЫЙ ТЕКСТ

FREETEXTTABLE

Вместо того, чтобы использовать Soundex, вам лучше вычислить расстояние Левенштейна между двумя строками. Смотрите статью в Википедии о расстоянии Левенштейна.

Здесь есть реализация TSQL алгоритма расстояния Левенштейна.

Поделитесь и наслаждайтесь.


РЕДАКТИРОВАТЬ 03-May-2012

Со времени написания моего первоначального ответа я узнал, что Oracle включает в себя расстояние Левенштейна и несколько других функций "сходства строк" ​​в пакете UTL_MATCH, который, я считаю, является стандартной частью базы данных. Документация здесь. Возможно, не имеет прямого отношения к исходному сообщению (которое было для SQL Server), но, возможно, полезно, так как многие магазины используют несколько баз данных.

Если вам нужно сделать все это в СУБД, лучше всего использовать UDF.

В противном случае, вы можете использовать эту технику, чтобы как минимум озвучить первые четыре слова индивидуально, используя PARSENAME:

Как разделить строку, чтобы получить доступ к элементу x?:

PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1)  --return computer
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2)  --return laptop
...

Тем не менее: использование PARSENAME таким способом является хаком, и серьезным ограничением является то, что он работает максимум для 4 частей. Если есть 5 или более слов, PARSENAME вернет NULL, так что вы должны проверить это условно и грациозно ухудшиться.

Вот упрощенный пример (опять же, без проверок NULL)

SELECT *
FROM Products 
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1))

Вы можете попытаться сохранить метафон каждого слова, соединенного дефисами. НАПРИМЕР stored_metaphone поле может содержать что-то вроде '-AKTRF-SPLS-'. Затем создайте запрос следующим образом:

$where = '(';
$search_sql = array();
$search_terms = explode(' ',$search);
foreach ($search_terms as $term) {
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'";
}
$where .= implode(' OR ',$search_sql);
$where .= ')';

NB это только часть запроса WHERE.

Насколько я знаю, метафон работает только с английским языком. Вышеупомянутый sql работает довольно хорошо на нескольких сайтах.

SOUNDEX может идеально подойти для вашей цели, но, пожалуйста, помните, что она может не дать хороших результатов ни для чего другого, кроме слов на английском или американском английском! Это может даже использоваться на немецких фонетических произнесенных словах, но это не будет работать ни с чем другим.

Другие вопросы по тегам