Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Full-Text Search. Postfix Searches  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Здравствуйте!
Подскажите, пожалуйста, как написать запрос с использованием Full-Text Search аналогичный запросу с LIKE на скриншоте?

Префиксное выражение написать не сложно.
Как написать постфиксное?

Спасибо.

К сообщению приложен файл. Размер - 15Kb
24 май 16, 14:27    [19212536]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
MSSQLAndDotNet,

> Как написать постфиксное?

никак не написать. нет такой возможности.
24 май 16, 14:50    [19212753]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
daw
MSSQLAndDotNet,

> Как написать постфиксное?

никак не написать. нет такой возможности.

спасибо за ответ
подскажите, а индексирование поможет при постфиксном шаблоне для LIKE ?
24 май 16, 15:09    [19212927]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Что делать, когда Full-Text бессилен

Если воспользуешься, напиши, что получилось, ладно? Интересно же...
24 май 16, 15:44    [19213180]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
Что делать, когда Full-Text бессилен

Если воспользуешься, напиши, что получилось, ладно? Интересно же...

все советуют, но на практике никто не пользовался :)
24 май 16, 15:46    [19213198]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
TaPaK
iap
Что делать, когда Full-Text бессилен

Если воспользуешься, напиши, что получилось, ладно? Интересно же...

все советуют, но на практике никто не пользовался :)


Это конечно, интересный метод, но в общем фигня
24 май 16, 16:30    [19213544]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Ролг Хупин
TaPaK
пропущено...

все советуют, но на практике никто не пользовался :)


Это конечно, интересный метод, но в общем фигня

неаргументативнеько
24 май 16, 16:33    [19213565]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Ролг Хупин
TaPaK
пропущено...

все советуют, но на практике никто не пользовался :)


Это конечно, интересный метод, но в общем фигня
Другие предложения есть?
С большим интересом посмотрим.
24 май 16, 16:37    [19213588]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
iap
Ролг Хупин
пропущено...


Это конечно, интересный метод, но в общем фигня
Другие предложения есть?
С большим интересом посмотрим.


не дописал, извините, метод хорошо, не не практичен для больших объемов.

Да, по этой задаче я бы предложил ТС поработать немного, может не все так плохо, варианты

1. Можно отредактировать список шумных слов
SELECT * FROM sys.dm_fts_parser (N' "часто оставленный номер клиента стоит вторым-третьим в карточке клиента, а из-за этого клиент не определяется" ', 1049, 0, 0);

Noise Word	часто
Exact Match	оставленный
Exact Match	номер
Exact Match	клиента
Exact Match	стоит
Noise Word	вторым
Noise Word	третьим
Noise Word	в
Exact Match	карточке
Exact Match	клиента
Noise Word	а
Noise Word	из
Noise Word	за
Noise Word	этого
Exact Match	клиент
Noise Word	не
Exact Match	определяется



2.
create table a (id int not null identity(1,1) primary key,
string nvarchar(1024)
)


insert into a(string)
select N'часто оставленный номер клиента стоит красным-черным трезво-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется'

select * from a where contains(*,N'FORMSOF(INFLECTIONAL, "оставленный") AND FORMSOF(INFLECTIONAL, "номер") AND FORMSOF(INFLECTIONAL, "красный") AND FORMSOF(INFLECTIONAL, "трезвый")')

-------
часто оставленный номер клиента стоит красным-черным трезвым-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется
24 май 16, 16:42    [19213621]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Ролг Хупин
iap
пропущено...
Другие предложения есть?
С большим интересом посмотрим.


не дописал, извините, метод хорошо, не не практичен для больших объемов.

Да, по этой задаче я бы предложил ТС поработать немного, может не все так плохо, варианты

1. Можно отредактировать список шумных слов
SELECT * FROM sys.dm_fts_parser (N' "часто оставленный номер клиента стоит вторым-третьим в карточке клиента, а из-за этого клиент не определяется" ', 1049, 0, 0);

Noise Word	часто
Exact Match	оставленный
Exact Match	номер
Exact Match	клиента
Exact Match	стоит
Noise Word	вторым
Noise Word	третьим
Noise Word	в
Exact Match	карточке
Exact Match	клиента
Noise Word	а
Noise Word	из
Noise Word	за
Noise Word	этого
Exact Match	клиент
Noise Word	не
Exact Match	определяется



2.
create table a (id int not null identity(1,1) primary key,
string nvarchar(1024)
)


insert into a(string)
select N'часто оставленный номер клиента стоит красным-черным трезво-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется'

select * from a where contains(*,N'FORMSOF(INFLECTIONAL, "оставленный") AND FORMSOF(INFLECTIONAL, "номер") AND FORMSOF(INFLECTIONAL, "красный") AND FORMSOF(INFLECTIONAL, "трезвый")')

-------
часто оставленный номер клиента стоит красным-черным трезвым-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется


1.
Ваш первый пример можно свести к простому разбиению на слова, а по ним уже like-ом с постфиксом. Но смысла никакого. Тогда уж быстрее будет сразу like-ом

2.
Второй пример будет работать если например поиск без приставки или просто по корню слова, но общую задачу не решает.
Например для выражения "вторым-третьим" в принципе через словоформы не решить задачу

спасибо за комментарий
24 май 16, 18:13    [19214092]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Господа, а программы, которые Вы пишите, без поиска что ли?
24 май 16, 18:16    [19214101]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Владислав Колосов
Member

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

программы, которые мы пишем, какбэ состоят из атомарных атрибутов. Вы вообще не ту технологию используете.
24 май 16, 18:25    [19214138]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
MSSQLAndDotNet
Ролг Хупин
пропущено...


не дописал, извините, метод хорошо, не не практичен для больших объемов.

Да, по этой задаче я бы предложил ТС поработать немного, может не все так плохо, варианты

1. Можно отредактировать список шумных слов
SELECT * FROM sys.dm_fts_parser (N' "часто оставленный номер клиента стоит вторым-третьим в карточке клиента, а из-за этого клиент не определяется" ', 1049, 0, 0);

Noise Word	часто
Exact Match	оставленный
Exact Match	номер
Exact Match	клиента
Exact Match	стоит
Noise Word	вторым
Noise Word	третьим
Noise Word	в
Exact Match	карточке
Exact Match	клиента
Noise Word	а
Noise Word	из
Noise Word	за
Noise Word	этого
Exact Match	клиент
Noise Word	не
Exact Match	определяется



2.
create table a (id int not null identity(1,1) primary key,
string nvarchar(1024)
)


insert into a(string)
select N'часто оставленный номер клиента стоит красным-черным трезво-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется'

select * from a where contains(*,N'FORMSOF(INFLECTIONAL, "оставленный") AND FORMSOF(INFLECTIONAL, "номер") AND FORMSOF(INFLECTIONAL, "красный") AND FORMSOF(INFLECTIONAL, "трезвый")')

-------
часто оставленный номер клиента стоит красным-черным трезвым-пьяным вторым-третьим в карточке клиента, а из-за этого клиент не определяется


1.
Ваш первый пример можно свести к простому разбиению на слова, а по ним уже like-ом с постфиксом. Но смысла никакого. Тогда уж быстрее будет сразу like-ом

2.
Второй пример будет работать если например поиск без приставки или просто по корню слова, но общую задачу не решает.
Например для выражения "вторым-третьим" в принципе через словоформы не решить задачу

спасибо за комментарий


Я немного торможу, можете объяснить?
1. Я привел это не для разбиения на слова, а для демонстрации, как сервер разбил и какой типа разбора.
Не вижу зачем бить на слова и использовать like

2. я же привел реальный запрос к таблице, на которой построен FTI. В запросе юзер использует "красный", "трезвый" и находит запись с "красным-черным", "трезвым-пьяным".
Да, шумные слова ТС может отредактировать и т.д. все от задачи зависит

Что не так? что не решается?
24 май 16, 18:26    [19214145]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
MSSQLAndDotNet
Как написать постфиксное?

1. Сделать вычисляемый столбец task_name_reversed as reverse(task_name) и добавить его к FTI.
2. Тогда постфиксное выражение будет contains(task_name_reversed, '"ьтерт*"').
24 май 16, 18:38    [19214201]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
invm
MSSQLAndDotNet
Как написать постфиксное?

1. Сделать вычисляемый столбец task_name_reversed as reverse(task_name) и добавить его к FTI.
2. Тогда постфиксное выражение будет contains(task_name_reversed, '"ьтерт*"').



Идея хорошая...но

"третий" ?
25 май 16, 10:36    [19216364]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Ролг Хупин
"третий" ?
Что вы имете в виду?
25 май 16, 10:57    [19216512]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
Ролг Хупин
TaPaK
пропущено...

все советуют, но на практике никто не пользовался :)


Это конечно, интересный метод, но в общем фигня
Я использовал, очень давно, такую самодельную индексацию для постфиксного поиска.
Это мало кому нужно, да, но если нужно, то без вариантов. Почему "фигня"?

Недостаток по сравнению с FTS понятен, не будет морфологии.
25 май 16, 11:04    [19216541]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
invm
MSSQLAndDotNet
Как написать постфиксное?

1. Сделать вычисляемый столбец task_name_reversed as reverse(task_name) и добавить его к FTI.
2. Тогда постфиксное выражение будет contains(task_name_reversed, '"ьтерт*"').
У него же поиск по середине слова, а с reversed прокатывает, если ищут по концу.

т.е. reversed можно использовать для поиска 'asdf*', но не для '*asdf*'
25 май 16, 11:06    [19216552]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
alexeyvg
У него же поиск по середине слова
Поиск по середине не постфиксный.
Ответ был на вопрос "Как написать постфиксное?"
25 май 16, 11:12    [19216591]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
invm
alexeyvg
У него же поиск по середине слова
Поиск по середине не постфиксный.
Ответ был на вопрос "Как написать постфиксное?"
Вопрос был про "постфиксное", а в коде поиск по середине слова :-)
AND "*треть*"
25 май 16, 11:15    [19216608]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
invm
Ролг Хупин
"третий" ?
Что вы имете в виду?


что слово "третий" вашем случае не будет найдено, поскольку ТС искать бы полнотекстово по формам, а не огрызки слова

автор
2. Тогда постфиксное выражение будет contains(task_name_reversed, '"ьтерт*"').
25 май 16, 14:54    [19218439]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
alexeyvg
Ролг Хупин
пропущено...


Это конечно, интересный метод, но в общем фигня
Я использовал, очень давно, такую самодельную индексацию для постфиксного поиска.
Это мало кому нужно, да, но если нужно, то без вариантов. Почему "фигня"?

Недостаток по сравнению с FTS понятен, не будет морфологии.


ну, вот
25 май 16, 14:55    [19218448]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Ролг Хупин
что слово "третий" вашем случае не будет найдено
Я писал, что FTI нужно строить только по reversed?
25 май 16, 15:00    [19218479]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search. Postfix Searches  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
Ролг Хупин
alexeyvg
Недостаток по сравнению с FTS понятен, не будет морфологии.

ну, вот
Ну, тут придётся выбирать.
Для бизнеса обычно (по моему опыту - чаще, как у других, не знаю) так: если требуется нахождение произвольных фрагментов слов, то морфология не нужна, поиск фраз не нужен и т.д. И наоборот.

То есть, либо ищут по куску номера накладной, названия города, куску фамилии.
Либо ищут по фразе, фрагменту фразы, в обычных текстах, и тогда не нужен поиск по середине слова - зачем? Действительно, трудно представить, что бы нормальную человеческую поисковую строку вводили из середин слов :-)

Так что это не "фигня", это просто не пересекается, разные области применения.
25 май 16, 18:29    [19219662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить