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

Вот моя проблема. Например, у меня есть таблица продукты, который содержит поле, Имя:

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 функционируйте к каждому слову от Поля имени и затем посмотрите, соответствует ли какой-либо из них исследуемому ключевому слову.

Если у кого-то есть какая-либо подсказка, как сделать это, которое было бы потрясающим.

6
задан Michael 18 September 2017 в 19:44
поделиться

4 ответа

Have you looked into the Full-Text Search feature in SQL Server? I know this is not exactly what you asked for. Its just that the SOUNDEX() function is used to find similar SOUNDING names (EX: SMITH and SMYTHE sound the same). In a search engine, however, how a word sounds is less important than the search words themselves. Full-Text Search also lets you use synonyms (allowing you to specify certain words that mean the same thing within your application's context), and have them automatically considered during your search.

Look at these pages for more information about Full Text Search in SQL Server:

Introduction to Full-Text Search

CONTAINS

CONTAINSTABLE

FREETEXT

FREETEXTTABLE

4
ответ дан 9 December 2019 в 20:44
поделиться

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

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

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


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

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

5
ответ дан 9 December 2019 в 20:44
поделиться

If you have to do it all in the RDBMS, a UDF would be the best if it's an option.

Otherwise, you could use this technique to at least soundex the first four words individually using PARSENAME:

From How do I split a string so I can access item x?:

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

However: using PARSENAME in this way is a hack and a serious limitation is it only works for a max of 4 parts. If there are 5 or more words PARSENAME will return NULL, so you have to check for that with a conditional and degrade gracefully.

Here's a simplified example (again, without the NULL checks)

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))
1
ответ дан 9 December 2019 в 20:44
поделиться

SOUNDEXSOUNDEX может идеально подойти для Вашего кошелька, но, пожалуйста, помните, что он может не дать хороших результатов ни для чего, кроме британских или американских английских разговорных слов! Он даже может быть использован для немецких фонетических слов, но с ЛЮБОЙ ИНФОРМАЦИЕЙ он не будет хорошо работать.

1
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: