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

Откуда:
Сообщений: 163
Приветствую.
Столкнулся с такой проблемой... Есть необходимость поиска по таблице резюме + по привязанным таблицам (опыт работы, опыт образования и т.д.).
Выглядит примерно так:

SELECT [KEY] As ResumeID FROM CONTAINSTABLE (Resumes, Title, @Keywords) 
UNION
SELECT ResumeID 
FROM ResumesCourseExperience
WHERE @SearchPlaceID = 2 AND CONTAINS (*, @Keywords) 
UNION
SELECT ResumeID 
FROM  ResumesEducationExperience
WHERE @SearchPlaceID = 2 AND CONTAINS(*, @Keywords)
UNION
SELECT ResumeID 
FROM ResumesOperationalExperience
WHERE @SearchPlaceID = 2 AND CONTAINS(*, @Keywords)

Где @SearchPlaceID = 2 - поиск везде и @SearchPlaceID = 1 - поиск только в заголовке резюме.
Предположим, что мы хотим найти программиста, который учился в МИФИ.
@Keywords = 'программист & МИФИ'

Но такой поиск не приведет к нужным нам результатам, так как хоть эти таблицы и части одного резюме, но слово "программист" будет встречаться в Resumes.Title, а слово "МИФИ" в ResumesEducationExperience.Institution.

Посоветуйте, пожалуйста, как правильнее организовать поиск в такой ситуации?
Спасибо.
19 июл 11, 12:50    [10994261]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Есть какие-нибудь варианты?
Пока есть такой вариант: в главную таблицу добавить поле varchar(max) и в него складывать все текстовые данные из разных таблиц, но по-моему должен быть вариант получше....
22 июл 11, 16:24    [11013804]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey30
Есть какие-нибудь варианты?
Пока есть такой вариант: в главную таблицу добавить поле varchar(max) и в него складывать все текстовые данные из разных таблиц, но по-моему должен быть вариант получше....

1. Если лексемы 'программист & МИФИ' находятся в разных таблицах, то почему они соединены через И ?
2. Откуда вы знаете, что все заданные пользователем лексемы не находятся в одной таблице ?
3. UNION - это не привязанные таблицы.
22 июл 11, 16:46    [11013989]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Glory
Alexey30
Есть какие-нибудь варианты?
Пока есть такой вариант: в главную таблицу добавить поле varchar(max) и в него складывать все текстовые данные из разных таблиц, но по-моему должен быть вариант получше....

1. Если лексемы 'программист & МИФИ' находятся в разных таблицах, то почему они соединены через И ?
2. Откуда вы знаете, что все заданные пользователем лексемы не находятся в одной таблице ?
3. UNION - это не привязанные таблицы.


1. Это вариант для одной таблицы.
2. Ну так привел же пример. Слово "Программист" встречается в таблице Resumes, а "Мифи" - в таблице ResumesOperationalExperience.
3. Безусловно. До этого было сделано через Join, но из-за жутких тормозов ( https://www.sql.ru/forum/actualthread.aspx?tid=830451 ) было переделано на такой вариант.
22 июл 11, 16:50    [11014025]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey30
Glory
2. Откуда вы знаете, что все заданные пользователем лексемы не находятся в одной таблице ?


2. Ну так привел же пример. Слово "Программист" встречается в таблице Resumes, а "Мифи" - в таблице ResumesOperationalExperience.

Внимательно прочитайте вопрос и свой ответ. Вы уже до выполнения запроса знаете, в какой таблице находится каждое искомое слово ?
22 июл 11, 16:53    [11014060]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
> Вы уже до выполнения запроса знаете, в какой таблице находится каждое искомое слово ?

Нет, до выполнения не знаю. Возможен вариант когда все нужные слова находятся в одной таблице, возможен вариант, что в разных.
22 июл 11, 17:00    [11014109]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey30
> Вы уже до выполнения запроса знаете, в какой таблице находится каждое искомое слово ?

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

Почему же тогда эти слова объединены через И, а не через ИЛИ ?
22 июл 11, 17:02    [11014123]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Потому как в примере показано то, что есть на данный момент.
Вариант который Вы, видимо, предлагаете, я пытался рассмотреть (объединить через ИЛИ) и получить список всех записей, содержащих "Программист" ИЛИ "МИФИ". Но остается вопрос как быть когда их отберем - еще дополнительно придется сравнивать на наличие обоих слов...
22 июл 11, 17:06    [11014151]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Так что, какое возможно решение?
Поиск через ИЛИ и затем проверка (каким пока непонятно образом) на наличие именно обоих слов?

Или какие-то еще есть варианты?
Спасибо.
25 июл 11, 15:13    [11023425]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Alexey30
До этого было сделано через Join, но из-за жутких тормозов ( https://www.sql.ru/forum/actualthread.aspx?tid=830451 ) было переделано на такой вариант.
Вроде я вам подсказал в том топике, как сделать быстро, и вы написали, что получилось.
25 июл 11, 15:22    [11023489]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
alexeyvg, да, огромное спасибо, оно так и сделано, как Вы предлагали.
Но сейчас вопрос не в производительности, а в том, как правильно построить нужны запрос...
25 июл 11, 16:00    [11023778]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Alexey30
Но сейчас вопрос не в производительности, а в том, как правильно построить нужны запрос...
Через join или union

Ну и собственно задачу надо для начала сформулировать.

Если вы свой вопрос прочитаете повнимательнее, то поймёте, что абсолютно неясно, что надо получить.

Вы чего хотите? Просто найти хоть что то похожее на искомые слова в требуемых разделах? Тогда нужно искать по ИЛИ и с union.

Однако это не решит вашу задачу:
Alexey30
Предположим, что мы хотим найти программиста, который учился в МИФИ.
@Keywords = 'программист & МИФИ'
Но такой поиск не приведет к нужным нам результатам, так как хоть эти таблицы и части одного резюме, но слово "программист" будет встречаться в Resumes.Title, а слово "МИФИ" в ResumesEducationExperience.Institution.
т.к. слово "программист" может встречаться в Institution, а слово "МИФИ" в Resumes.Title

Т.е. семантика искомых слов, их принадлежность к какому то разделу пользователем не описана.

При этом обычно пользователям это и не надо, они хотят найти просто максимальное соответствие текста.
Поэтому рассматривайте как вариант объединение текстов в один и поиск по нему, если у вас конечно нет какого либо вменяемого алгоритма.
25 июл 11, 16:36    [11024002]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
alexeyvg, семантика в данном случае не важна.
Задача очень простая - есть текстовое поле и комбобокс (Где искать: только в названии, везде).
"Везде" имеется в виду по всем таблицам, связанным с резюме - т.е. в том числе по таблицам с образованием, с опытом работы.
Если рекрутер вводит "программист мифи", то подразумевается, что во всем резюме (составленном из нескольких таблиц) встречаются _оба_ этих слова. Т.е. неважно, где эти слова расположены в базе, важно, что в результирующем наборе данных для резюме эти оба слова встречаются.
Это могут быть и другие слова, например, "бухгалтер & 1с" (тут могут найтись и резюме, которые так называются, и резюме, в заголовке у которых слово "бухгалтер", а в опыте работы встречается "1с". Или, например, "начальник cisco" (например, резюме с названием "Начальник отдела", и с опытом работы, в котором будет что-то сказано про cisco).

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

Второй вариант - искать по всем таблицам через ИЛИ. Но тогда возникает необходимость последующей проверки на И (после того как из нескольких таблиц отобрали по ИЛИ), которую не совсем понятно как лучше делать.
25 июл 11, 16:50    [11024093]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
зная что и где хочте юзер найти можно создавать запросы динамически.
В вашем случае надо знать, что юзер хочет искать в полях "образования", но не "мест работы". И все получится.
25 июл 11, 16:51    [11024103]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Winnipuh, заранее неизвестно, где найдется нужное совпадение. Еще раз повторюсь - поиск или только по названию или "везде".
25 июл 11, 16:53    [11024125]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey30

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

А как по-вашему сервер будет искать в разных таблицах как в одной то ?

Alexey30
Второй вариант - искать по всем таблицам через ИЛИ. Но тогда возникает необходимость последующей проверки на И (после того как из нескольких таблиц отобрали по ИЛИ), которую не совсем понятно как лучше делать.

Пусть пользователь указывает, какие слова к каким частям "резюме" он относит
25 июл 11, 16:53    [11024128]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
Glory
А как по-вашему сервер будет искать в разных таблицах как в одной то ?

Вот именно по этому я данный вопрос и задал - предполагал, что может быть какое то иное решение.
25 июл 11, 16:55    [11024144]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Alexey30
Как я и писал в самом первом сообщении, первое что приходит на ум - это добавить еще одно поле, в которое сгрузить все текстовые данные каждого резюме. Но это, как мне кажется, не самый верный вариант.
Это самое простое.
Alexey30
Второй вариант - искать по всем таблицам через ИЛИ. Но тогда возникает необходимость последующей проверки на И (после того как из нескольких таблиц отобрали по ИЛИ), которую не совсем понятно как лучше делать.
Не получится, нету такого инструмента в сиквеле.

Точнее, есть специальные вьюхи, но они непросты в использовании и поиск будет медленным.

Ещё можно самому искать отдельно по словам и потом искать пересечение результатов, но это будет тоже медленнее.
25 июл 11, 17:05    [11024204]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Alexey30
Member

Откуда:
Сообщений: 163
alexeyvg, понятно, именно это и хотелось узнать.

Большое всем спасибо за участие!
25 июл 11, 17:08    [11024222]     Ответить | Цитировать Сообщить модератору
 Re: FTS - Общий поиск по нескольким таблицам  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Alexey30
Winnipuh, заранее неизвестно, где найдется нужное совпадение. Еще раз повторюсь - поиск или только по названию или "везде".


где найдется ясное дело неизвестно, НО в вайшей задаче вы не хотите искать в конкретном примере по местам работы, значит юзер должен указать, что он там не хочте искать и следовательно вы делаете дитнамический запрос, иключая поиск в местах работы.
А иначе поулчается с однйо сторооны вы всегда ищете ВЕЗДЕ, но в мыслях не хотите искать в какой-то таблице.
25 июл 11, 17:39    [11024470]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить