2014-09-20 4 views
0

У меня есть таблица с именем infoone с двумя столбцами address и locationCITY.sql поисковый запрос с аналогичным оператором

Я хочу написать поисковый запрос.

Если пользователь ищет Edmonton, он должен вернуть все записи, имеющие город Edmonton.

Если пользователь ищет 12 main street Edmonton, он должен вернуть все соответствующие записи. 12 main street это адрес и Edmonton является город

Что запрос я в следующем,

string sql = "select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone where "; 
    sql += "(((address like '%"+txtSearch.Text+"%') or (address like '')) and ((locationcity like '%"+txtSearch.Text+"%') or (locationcity like '')) and ((address LIKE '%"+txtSearch.Text+"%') or (address like '')))"; 

Выше запроса ничего не возвращает, когда я ищу:

main street Edmonton 

Пользователь также будет разрешено поиск без города: 12th main street

Что я делаю неправильно?

Пожалуйста, помогите

Благодарности

+1

Что произойдет, если я ищу ''))) DROP TABLE infoone - '? –

ответ

2

Свободная форма поиска адресов очень сложно.

Давайте посмотрим на ваши примеры

Address   locationCity 
12 Main Street Edmonton 
456 Thomas Ave St Martin 

Возможные поисковые запросы

  • Эдмонтон - Если только 1 слово, мы должны предположить, что это город? Если да, то как найдет ли поиск Святого Мартина?
  • 12 Main Street Эдмонтон - Откуда вы знаете, что Эдмонтон - это город? Может ли пользователь искать только название улицы?

Я бы предположил, что ваш интерфейс принимает два столбца: один для адреса и один для города, это упростит поиск.

where <other conditions> 
AND 
(locationcity like '%CitySearchFld%' and address like '%AddresssSearchFld%') 

Нет необходимости искать пустой, потому что если пользователь оставляет поле пустым, поиск в %% будет соответствовать всем строкам

Других соображениями

Что происходит в поисках пользователей для

12 Main St 

или

Edmenton

Сокращения? Орфографические?

Для обработки аббревиатур, я бы создать список стоп-слов, которые бы удалить общие аббревиатуры из поля адреса, такие вещи, как St, улица, проспект, проспект и т.д. Таким образом, поиск становится

12 Main

Мне очень хотелось бы пропустить запись, потому что я не был уверен, что это была улица или улица в таблице.

Вы можете также использовать функцию знает как Soundex (родной SQL) или Metaphone (пользовательский SQL или CLR), чтобы иметь дело с опечатками ...

Успехов

0

этого вида поиска настолько сложен, но есть много разных способов сделать хороший поиск по адресу:

Самый простой способ - найти полный адрес, подобный этому;

выбрать * из адр WHERE (locationcity + «» + адрес), как „%“% Поиск по названию

но нет никакого способа узнать, какое слово город или нет.

1

Я не верю, что ваше предложение where делает то, что вы намеревались. Давайте удалим внешнюю строку вар и переформатировать для читаемости:

select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1 
,LOCATIONCITY,ADDRESS,DateT,RENT 
from infoone 
where(
    ((address like '%"+txtSearch.Text+"%') or (address like '')) 
    -- #1 address must match full text or be blank 
    and 
    ((locationcity like '%"+txtSearch.Text+"%') or (locationcity like '')) 
    -- #2 locationcity must match full text or be blank 
    and 
    ((address LIKE '%"+txtSearch.Text+"%') or (address like '')) 
    -- #3 address must match full text or be blank. Seems a duplicate of #1 
    ) 

Эти три прикованы вместе с Андами, так что все три условия должны быть истинными для того, чтобы вернуть результат.

По крайней мере, где положение может быть переписано такое:

select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1 
,LOCATIONCITY,ADDRESS,DateT,RENT 
from infoone 
where(
    (address like '%"+txtSearch.Text+"%') 
    or 
    (locationcity like '%"+txtSearch.Text+"%') 
    or 
    (address + locationcity like '%"+txtSearch.Text+"%') 
    or 
    (address + ' ' + locationcity like '%"+txtSearch.Text+"%') 
    ) 

Это вернет запись, если текст матч был найден в любом адресе или locationcity, или если текст спички их при объединении или в сочетании с пространством.

Вот почему вы не получите никаких результатов на введенном образце. С приведенным выше кодом вы должны получить соответствие в последнем четвертом состоянии при поиске «main street edmonton»

Сначала вы должны получить код, работающий с нединамическим SQL в SSMS, используя переменную для вашего текста (например, @TEXT), и как только он возвращает результаты, которые вы хотите на основе вашего текстового параметра, вы можете переключить его на динамический. Написание этого как строки SQL для выполнения просто усложняет ситуацию, пока вы все еще работаете над разработкой кода SQL.

Для более широкого решения, вы можете захотеть взглянуть на Full Text Search: http://msdn.microsoft.com/en-us/library/ms142571.aspx

Это распадается строка на отдельные слова, и ищет те слова, что позволяет подойти с весовыми догадками и рейтинг матча. Он даже позволяет использовать аналогичные термины с использованием тезауруса, поэтому, если кто-то искал «123 Main St.», и "123 Main Street" была в базе данных, она найдет их в качестве совпадения.

Смежные вопросы