SQL - поисковая база данных с оператором LIKE - PullRequest
7 голосов
/ 03 марта 2011

Учитывая ваши данные, хранящиеся где-то в базе данных:

Hello my name is Tom I like dinosaurs to talk about SQL.  
SQL is amazing. I really like SQL.

Мы хотим реализовать поиск по сайту, чтобы посетители могли вводить термины и возвращать соответствующие записи. Пользователь может искать:

Dinosaurs

И SQL:

WHERE articleBody LIKE '%Dinosaurs%'

Отлично справляется с возвратом правильного набора записей.

Как бы мы справились, если пользователь неправильно вводит динозавров? IE:

Dinosores

(Бедная боль в дино). Как мы можем искать, допуская ошибку в правописании? Мы можем связать обычные орфографические ошибки, которые мы видим в поиске, с правильным написанием, а затем искать по оригинальным терминам + исправленный термин, но это требует много времени для обслуживания.

Как-нибудь программно?

Редактировать

Похоже, что SOUNDEX может помочь, но кто-нибудь может привести пример использования soundex при вводе поискового запроса:

Dinosores wrocks

возвращает записи вместо выполнения:

WHERE articleBody LIKE '%Dinosaurs%' OR articleBody LIKE '%Wrocks%'

что вернет squadoosh?

Ответы [ 6 ]

4 голосов
/ 03 марта 2011

Если вы используете SQL Server, взгляните на SOUNDEX .

Для вашего примера:

select SOUNDEX('Dinosaurs'), SOUNDEX('Dinosores')

Возвращает идентичные значения (D526).

Вы также можете использовать функцию DIFFERENCE (на той же ссылке, что и soundex), которая будет сравнивать уровни сходства (4 - наиболее похожий, 0 - наименее).

SELECT DIFFERENCE('Dinosaurs', 'Dinosores'); --returns 4

Редактировать:

После небольшого поиска многотекстовой опции кажется, что это не так просто.Я хотел бы отослать вас к ссылке на ответ Fuzzt Logic, предоставленной @Neil Knight (+1 к этому, для меня!).

В этой статье stackoverflow также подробно описаны возможные источники для внедренияНечеткая логика в TSQL.Однажды респондент также указал, что полнотекстовая индексация может стать предметом изучения.

3 голосов
/ 03 марта 2011

Я не уверен, возможно ли введение отдельной «поисковой системы», но если вы посмотрите на такие продукты, как Google Search Appliance или Autonomy, эти продукты могут индексировать базу данных SQL и предоставлять дополнительные параметры поиска - например, обработку орфографические ошибки, а также синонимы, взвешивание результатов поиска, альтернативные рекомендации по поиску и т. д.

Кроме того, функцию полнотекстового поиска SQL Server можно настроить на использование тезауруса, который может помочь: http://msdn.microsoft.com/en-us/library/ms142491.aspx

Вот еще один вопрос от того, кто настраивает тезаурус для обработки типичных ошибок: Тезаурус FORMSOF в SQL Server

3 голосов
/ 03 марта 2011

Просто чтобы выбросить альтернативу.Если SSIS является опцией, то вы можете использовать Fuzzy Lookup.

SSIS Fuzzy Lookup

3 голосов
/ 03 марта 2011

Возможно, ваша СУБД имеет функцию SOUNDEX? Вы не упомянули, кто из них был здесь замешан.

1 голос
/ 03 марта 2011

Краткий ответ, в большинство движков SQL ничего не встроено, чтобы можно было выполнить словарную коррекцию "толстых пальцев".SoundEx действительно работает как инструмент для поиска слов, которые будут звучать одинаково и таким образом корректировать фонетические орфографические ошибки, но если пользователь набрал «Dinosars», пропустив окончательную букву U, или действительно «жирный», и ввел «Dinosayrs», SoundExне возвращает точное совпадение.

Звучит так, будто вы хотите что-то на уровне поиска Google "Вы имели в виду _ _ ?"особенность.Я могу сказать вам, что это не так просто, как кажется.На 10 000-футовом уровне поисковая система просматривает каждое из этих ключевых слов и проверяет, находится ли оно в «словаре» известных «хороших» поисковых терминов.Если это не так, он использует алгоритм, очень похожий на предложение проверки орфографии, чтобы найти словарное слово, наиболее близкое к совпадению (требуется наименьшее количество буквенных замен, дополнений, удалений и транспозиций, чтобы превратить данное слово в словарное слово).Это потребует некоторого сложного процедурного кода либо в хранимой процедуре, либо в функции CLR Db в вашей базе данных, либо на уровне бизнес-логики.

0 голосов
/ 19 апреля 2013

Вы также можете попробовать SubString(), чтобы исключить первые 3 или около того символов. Ниже приведен пример того, как этого можно достичь

SELECT Fname, Lname  
FROM Table1 ,Table2
WHERE substr(Table1.Fname, 1,3) || substr(Table1.Lname,1 ,3) = substr(Table2.Fname, 1,3) || substr(Table2.Lname, 1 , 3))
ORDER BY Table1.Fname;
...