Страница: 1 | 2 |
Красивый вопросец. Треба щось таке: select m3.id, m3.subject, m3.text Так должно работать Ежели стандартными методами, то можно попытаться вот так: select m3.id, m3.subject, m3.text Если сервер установлен как case sensitive, тогда where upper(text) like upper('%фраза поиска%'). В принципе лучше всегда стараться сменить in на join. Извини, задурили голову (отвечал с работы) конечно надо так: select m1.id, m1.subject, m1.text
Вопрос: full-text-search
Добавлено: 07.06.04 06:22
Автор вопроса: Павел | Web-сайт:
Кто что знает про Full Text Search в MS SQL Server?
Я вот думаю, может его удастся припахать для поиска по сайту?
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #1
Добавлено: 09.06.04 18:03
Что именно интересует? В принципе припахать можно, но требуется довольно мощный сервер.
Номер ответа: 2
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #2
Добавлено: 09.06.04 18:14
Да сервер выдержит.. Тут на него уже столько понавешено, а он всё
живой
Конкретно.. Например, имеем таблицу Articles:
id int
title varchar
text ntext
Нужно провести по ней поиск по полям title и text... Получить id
записей, в которых найдены нужные слова. fulltextsearch сможет помочь?
Номер ответа: 3
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #3
Добавлено: 10.06.04 03:24
Здесь поможет. Свисти если нужно что-нибудь конкретное.
Номер ответа: 4
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #4
Добавлено: 10.06.04 09:01
Вопрос наверноче чисто по SQL...
Надо провести поиск по форуму. Структура таблицы форума:
id int Identity
thread_parent int
subject varchar
text ntext
...
Если запись - вопрос, то thread_parent=0. Если запись - ответ, то
thread_parent равен полю id соответствующего вопроса. Нужно провести
поиск по всей таблице (искать слово в поле text, например) и получить
только записи вопросов (если слово найдено в ответе, то нужно отдать
вопрос, соответствующий ответу).
Можно сделать это примерно так:
Select * From Messages Where criteria And thread_parent=0 Union
Select * From Messages Where id in (Select thread_parent From Messages Where
criteria And thread_parent<>0)
Но тогда мы получим ряд повторяющихся записей. Как этого избежать?
Номер ответа: 5
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #5
Добавлено: 10.06.04 23:36
from Messages m1
join CONTAINSTABLE(Messages,text,
'("select distinct" NEAR from OR "Billy must die" NEAR Microsoft)') as m2
on m1.id=m2.[KEY]
join Messages m3
on m1.id=m3.id
where m2.RANK>2 --степень подобия
and m3.thread_parent=0
and criteria
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 11.06.04 04:59
Гм.. Не могу врубиться в запрос
Во-первых, зачем это?
"select distinct" NEAR from OR "Billy must die" NEAR Microsoft
Во-вторых, что за степень подобия? Исходя из чего она получается?
Номер ответа: 7
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #7
Добавлено: 11.06.04 15:14
А это собственно и есть команды используемые в Full-Text Search. Мы ищем записи где фраза "select distinct" расположенна возле слова from или любимая фраза биллоненавистников расположенна рядом с Microsoft в таблице Messages колонке text. Степень подобия определяется Full-text index автоматически. Собственно здесь нужно на практике поиграться какое значение давать.
Номер ответа: 8
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #8
Добавлено: 11.06.04 15:16
Проости старика, степень подобия найденного текста запросу, склероз. блиню
Номер ответа: 9
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #9
Добавлено: 11.06.04 15:21
Погоди.. FullTextSearch - конечно дело хорошее.. Но я спрашивал, как
это сделать без его участия, простым SQL-запросом
Номер ответа: 10
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #10
Добавлено: 11.06.04 16:48
from Messages m1
join (select id, subject from Messages where text like '%фраза поиска%') as m2
on m1.id=m2.id
and m1.subject=m2.subject
join Messages m3
on m1.id=m3.id
and m1.subject=m3.subject
where criteria
Номер ответа: 11
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #11
Добавлено: 12.06.04 00:03
from Messages m1
join (select id, subject from Messages where text like '%фраза поиска%') as m2
on m1.id=m2.id
and m1.subject=m2.subject
where m1.thread_parent=0 and criteria
Номер ответа: 12
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #12
Добавлено: 01.07.04 17:16
Твой вариант не пашет...
Немного подумал... и написал вот это:
SELECT subject, text
FROM Messages
WHERE (id IN
(SELECT DISTINCT id
FROM Messages
WHERE (thread_parent = 0) AND (text LIKE '%.NET рулит%') OR
(id IN
((SELECT thread_parent
FROM Messages
WHERE text LIKE '%.NET рулит%')))))
Номер ответа: 13
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #13
Добавлено: 02.07.04 03:04
В твоем варианте я вижу главную проблему в использовании IN с подселектами. Очень замедляет исполнение комманды. С другой стороны такой запрос вернет все строки для каждого ID где хотя бы в одной из строк присутствует строка поиска. Поэтому (SELECT DISTINCT id FROM Messages WHERE (thread_parent = 0) AND (text LIKE '%.NET рулит%') не нужен. Все равно он никак не влияет на результат. Если задача остается прежней, т.е. вернуть только строку вопроса, то тогда попробуй вот такой:
select m1.id, m1.subject, m1.text
from Messages m1 join (select distinct id, subject from Messages where text like '%NET рулит%') as m2 on m1.id=m2.id where m1.thread_parent=0
Моей ошибкой было добавление subject.
Номер ответа: 14
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #14
Добавлено: 02.07.04 06:13
Ладно.. Пока работает. Хотя Distinct действительно зря
Я в твоём запросе этого не просёк:
m1.id=m2.id
Зачем?
Фактически он у тебя будет искать только в первых сообщениях темы (где
thread_parent = 0), а мне надо, чтоб искал по всем сообщениям, а
выводил номера тем.
Номер ответа: 15
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #15
Добавлено: 02.07.04 17:02
m1.id=m2.id не мешает искать по всем сообщениям. Он позволяет вернуть только первое сообщение из темы, где в любом из сообщений содержится строка поиска, если конечно я правильно понял смысл id. Значение поля одинаково для всех сообщений темы, не так ли?