SQL-запрос - поиск по нескольким полям - PullRequest
3 голосов
/ 12 марта 2009

Я пытаюсь реализовать поиск, где вы можете ввести более одного критерия поиска для формирования И-условия. Также следует поискать в разных полях базы данных.

Так, например:
Вы, когда вы вводите "Билл Сиэтл" , вы должны получить запись, где ИМЯ соответствует Билл и СИТИ соответствует Сиэтл . Вы не должны получить строк, где только CITY соответствует Сиэтл .

Теперь, это не кажется сложным, но на самом деле это кажется сложнее, чем я думал. Я придумал что-то вроде этого:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (NAME LIKE 'Seattle%')) 
AND
((CITY LIKE 'Bill%') OR (CITY LIKE 'Seattle%'))

Это хорошо работает в нашем предыдущем случае, но предположим, что мы добавили еще одно поле:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (NAME LIKE 'Seattle%')) 
AND
((CITY LIKE 'Bill%') OR (CITY LIKE 'Seattle%'))
AND
((COMPANY LIKE 'Bill%') OR (COMPANY LIKE 'Seattle%'))

Теперь он не вернет желаемый результат. Что мне действительно нужно (я полагаю), так это способ определить, является ли подусловие типа

 ((COMPANY LIKE 'Bill%') OR (COMPANY LIKE 'Seattle%'))

возвращает что-то, и если нет, мне нужно игнорировать это условие.

Кстати, я использую MSSQL '05.

Ответы [ 3 ]

12 голосов
/ 12 марта 2009

Прежде всего, я не знаю, как это делается на MSSQL, но вы можете посмотреть на полнотекстовый поиск.

С другой стороны, это может быть то, что вы действительно имеете в виду:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (CITY LIKE 'Bill%') OR (COMPANY LIKE 'Bill%'))
AND
((NAME LIKE 'Seattle%') OR (CITY LIKE 'Seattle%') OR (COMPANY LIKE 'Seattle%'))
4 голосов
/ 12 марта 2009

Полнотекстовое индексирование позволяет использовать как Contains, так и Conatainstable, что чрезвычайно полезно для ситуаций, которые вам требуются.

0 голосов
/ 12 марта 2009

Если вы хотите сделать это очень хорошо, это будет очень сложно. В идеальном мире ваша программа может посмотреть на каждое ключевое слово и определить его значение, определив, к какому столбцу оно должно соответствовать. Но это требует некоторой изобретательности - распознавания естественного языка.

Ваш пример поиска «Билл Сиэтл» потребовал бы, чтобы программа идентифицировала «Билл» как часть имени человека, а «Сиэтл» - как название города. Простым решением будет создание списков всех известных городов и поиск там ключевых слов, пометить их как названия городов, если они найдены. Вы можете сделать то же самое для компаний, а затем считать все ключевые слова, которые не похожи на города или компании, частичными именами людей. Используя эту классификацию, SQL-запрос должен быть простым.

Но я вполне уверен, что простой процесс, как я описал выше, будет хрупким. Поэтому, если вы не используете более интеллектуальные решения для анализа (см. пример парсера из проекта OpenCalais для идеи), я рекомендую простой способ:

Самый простой способ - выполнить полнотекстовый поиск по всем текстовым полям вашей таблицы, как указано выше, и упорядочить результаты по рангу - это, вероятно, хорошее решение 80-20.

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