Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Привет.
Подскажите как можно по умному сделать поиск введенной строки юзером, но чтобы был поиск как-то "по словам" что ли.
Простой Like Это не корректно думаю.

Можно ли это сделать регулярными выражениями ?

Гугел говорит, что в regexp'ах есть такая штука как "Word Boundaries"
http://www.regular-expressions.info/wordboundaries.html
Что означает как "начало или конец слова". Например так будет найденно то, что мне нужно, по идее '\bword\b'

Но не могу найти подобного для MS SQL.

Если в MS SQL нету "Word Boundaries" то похоже нужно писать его ручками. Но не могу точно придумать как это будет выглядеть...

Подскажите пожалуйста. Чувствую, что я изобретаю велосипед, который наверное уже изобретен в MS SQL.
15 май 16, 00:35    [19174471]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Смотрю есть какой-то Full-Text Search, но похоже это слишком сложно. Например не ясно требование "Для реализации полнотекстового поиска компонент Full-Text Search (Полнотекстовый поиск) должен быть установлен;".

И как я понял там заморочки с языком. Его нужно указывать что ли.
15 май 16, 00:40    [19174495]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27871
ProBiotek, а объясните простыми словами и примерами, что и где Вы хотите искать.
15 май 16, 08:47    [19174879]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
skyANA,

В текстовом поле Message nvarcharm(max). Хотелось бы искать "полное вхождение слова" (а не чистый LIKE), которое ввел пользователь.

Например если ввел 'ааа', хотелось бы, чтобы нашел ' aaa 111', 'aaa!', ';aaa'. Но не должен найти 'aaaaff', 'aaa111','22aaaa'
Если честно даже сам не могу написать некую формулу :) На самом деле такое требование есть в ТЗ, и я сам пытал менеджера что же он хочет. Идею я понял так. Теперь ищу решение.

Но опять же, в регэкспах есть некое понятие "Word Boundaries". Похоже оно мне нужно.
15 май 16, 13:24    [19175343]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
ProBiotek
skyANA,

В текстовом поле Message nvarcharm(max). Хотелось бы искать "полное вхождение слова" (а не чистый LIKE), которое ввел пользователь.

Например если ввел 'ааа', хотелось бы, чтобы нашел ' aaa 111', 'aaa!', ';aaa'. Но не должен найти 'aaaaff', 'aaa111','22aaaa'
Если честно даже сам не могу написать некую формулу :) На самом деле такое требование есть в ТЗ, и я сам пытал менеджера что же он хочет. Идею я понял так. Теперь ищу решение.

Но опять же, в регэкспах есть некое понятие "Word Boundaries". Похоже оно мне нужно.

Полнотекстовый поиск + where contains
15 май 16, 13:28    [19175351]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Rankatan,

where contains я нашел, понял что он относится к полнотекстовому индексу. Но никогда не работал с ним. Вообще не знаю какие там тонкости, но похожи они есть - с языком например. В Express версии базы он есть ?
15 май 16, 13:39    [19175380]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
ProBiotek
Rankatan,

where contains я нашел, понял что он относится к полнотекстовому индексу. Но никогда не работал с ним. Вообще не знаю какие там тонкости, но похожи они есть - с языком например. В Express версии базы он есть ?

Есть, только нужно ставить SQL Server Express With Advanced Services. В интернете полно статей как это делать, ничего сложного.

Устанавливаем компоненты полнотекста. Дальше ПКМ по таблице - создать полнотекст. + настраиваем джоб который обновляет полнотекстовый индекс (автоматически не происходит).
15 май 16, 13:47    [19175397]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
кхм, джобов в експресс нет. Поэтому настраивает батник и вставляем выполнение в обычный планировщик windows.
15 май 16, 13:52    [19175404]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Слишком сложно. И поддерживать потом все это придется. Не хочется так заморачиваться ради одной задачки.
15 май 16, 14:05    [19175438]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
ProBiotek,

на мой взгляд можно попробовать
как-то частично покрыть такую функциональность
с помощью каких нибудь like и substring

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

приближаться к этому средствами sql можно, но хлопотно
например заменить все неправильные символы на пробелы в строке в которой ищем
добавить в начало и конец по пробелу в строку в которой ищем и в ту которую ищем
ну вот теперь может уже можно и лайкать
.....
15 май 16, 20:58    [19176477]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
up.
Как лучше реализовать данную задачу ? Все при реализации поиска делают простой like ?
16 май 16, 11:15    [19177792]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ProBiotek,

вот такой вариант есть http://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text.aspx
16 май 16, 11:21    [19177821]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
TaPaK,

Эх. Я то ищу вариант просто с каким-то хитрым условием в where.

Варианты с Full-Text поиском или, тем более, созданием 5-10 вспомогательных таблиц - чтобы только заработало, не очень хочется. Мне же просто сделать поиск по одной таблички (ну может потом еще куда прикрутить, если решение понравится). Создавать и поддерживать какую-то огромную инфраструктуру, не стоит.
16 май 16, 11:52    [19178002]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ProBiotek,

просто это типа так что ли?

NAME LIKE '%%[^a-zА-я0-9]text%[^a-zА-я0-9]%'	OR
NAME LIKE 'text%[^a-zА-я0-9]%'			        OR
NAME LIKE '%[^a-zА-я0-9]text'
16 май 16, 12:13    [19178128]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
ProBiotek
Я то ищу вариант просто с каким-то хитрым условием в where.
Верите в чудеса?

Если не устраивает FTS (у вас на него идиосинкразия что ли?) напишите CLR-обертку для регулярных выражений. Или возьмите готовую - https://www.sql.ru/forum/1144247/faq-regex-parsim-zamenyaem-razbivaem-krutim-vertim?hl=regex
16 май 16, 12:15    [19178148]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
ProBiotek,

не пойму, вы чтоли совсем не хотите сами что-то попробовать?
я же предложил довольно правильный вариант
' '+replace(replace(name,';',' '),'!',' ')+' ' like ' '+searchString+' '
надо хотя-бы попробовать и откритиковать, может допилить чуток и все поедет
16 май 16, 13:02    [19178391]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
leov
ProBiotek,

не пойму, вы чтоли совсем не хотите сами что-то попробовать?
я же предложил довольно правильный вариант
' '+replace(replace(name,';',' '),'!',' ')+' ' like ' '+searchString+' '
надо хотя-бы попробовать и откритиковать, может допилить чуток и все поедет

это что-то совсем странное...
16 май 16, 13:15    [19178474]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
да все просто как 2+2*2.

Тс - хочет найти слово отделенное разделителями
Нужно только определиться что является разделителями между словами вот и все.
что то типа такого
declare @Delim varchar(255), @text varchar(255), @Like varchar(512)
set @Delim = '[,.!;:)({}]' --- указывй что хочешь
set @text = 'aaa'


select*
from a
where
           a.Str like '%'+@text+'%'
and      (    a.Str like '%'+@Delim+@text+@delim+'%'
            or  a.Str like @text+@delim+'%'
            or  a.Str like '%'+@Dleim+@text)






TaPaK
ProBiotek,

просто это типа так что ли?

NAME LIKE '%%[^a-zА-я0-9]text%[^a-zА-я0-9]%'	OR
NAME LIKE 'text%[^a-zА-я0-9]%'			        OR
NAME LIKE '%[^a-zА-я0-9]text'
16 май 16, 14:49    [19179103]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Jaffar,

а в чём смысл
  a.Str like '%'+@text+'%'
?
16 май 16, 15:00    [19179186]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
TaPaK
Jaffar,
select*
from a
where
           a.Str like '%'+@text+'%'
and      (    a.Str like '%'+@Delim+@text+@delim+'%'
            or  a.Str like @text+@delim+'%'
            or  a.Str like '%'+@Dleim+@text)



Наверное это примерно то, что нужно.
Я то надеялся что уже кто-то такое делал и есть хорошее, красивое решение - потому и задал вопрос. Но похоже я могу лишь ожидать велосипеда на свой вопрос :)


TaPaK,

Смысл наверное в оптимизации. Сначала текст будет "поверхностно" проверен на наличие искомого текста в принципе, и если да, то дальше будут применяться доп условия, проверяющие что искомый текст является словом(ограничен разделителями).
16 май 16, 17:20    [19179991]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ProBiotek

TaPaK,

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

Ох уж эти сказки, ох уж эти сказочники(с)
16 май 16, 17:22    [19180003]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
TaPaK,

Обратите внимание, что там идет OR. И по сути выходит 3 проверки на LIKE с конкатенацией строк. Может эффективней сначала проверить на то, что в тексте есть вообще искомое слово, чем делать 3 чуть более сложные проверки ? По моему код верно написан.
16 май 16, 17:30    [19180035]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ProBiotek
TaPaK,

Обратите внимание, что там идет OR. И по сути выходит 3 проверки на LIKE с конкатенацией строк. Может эффективней сначала проверить на то, что в тексте есть вообще искомое слово, чем делать 3 чуть более сложные проверки ? По моему код верно написан.

наверно ещё важен порядок ? ведь если написать
select*
from a
where
      (    a.Str like '%'+@Delim+@text+@delim+'%'
            or  a.Str like @text+@delim+'%'
            or  a.Str like '%'+@Dleim+@text
     ) AND
           a.Str like '%'+@text+'%'
всё поменяется?
16 май 16, 17:33    [19180045]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
ProBiotek,

Вы несколько неправильно оцениваете назначение языка T-SQL, его суть состоит в матобеспечении реляционной модели базы данных, к коей разбор и анализ символьным строк никак не относится.
В средствах языка существуют возможности работы со строками, но только на самом примитивном уровне.
Для покрытия особых потребностей можно использовать CLR объекты - функции, процедуры, триггеры, типы. Однако, их использование является компромиссом между потребностями и производительностью выборки данных.
16 май 16, 17:33    [19180046]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать поиск в тексте 'слова'. Не простой like.  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
ProBiotek
Смысл наверное в оптимизации.
Забавно.
Способы, позволяющие не сканировать таблицу целиком вы отвергаете на корню.
Зато заботитесь об оптимизации предикатов при этом самом полном сканировании.
16 май 16, 17:34    [19180052]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить