Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 | 2 |

 

  Вопрос: full-text-search Добавлено: 07.06.04 06:22  

Автор вопроса:  Павел | Web-сайт: www.vbnet.ru | ICQ: 326066673 
Кто что знает про Full Text Search в MS SQL Server?
Я вот думаю, может его удастся припахать для поиска по сайту?

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #1 Добавлено: 09.06.04 18:03
Что именно интересует? В принципе припахать можно, но требуется довольно мощный сервер.

Ответить

Номер ответа: 2
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #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

Красивый вопросец.  Треба щось таке:

select m3.id, m3.subject, m3.text
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-сайт: www.vbnet.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #9
Добавлено: 11.06.04 15:21
Погоди.. FullTextSearch - конечно дело хорошее.. Но я спрашивал, как
это сделать без его участия, простым SQL-запросом :)

Ответить

Номер ответа: 10
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #10 Добавлено: 11.06.04 16:48

Ежели стандартными методами, то можно попытаться вот так:

select m3.id, m3.subject, m3.text
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

Если сервер установлен как case sensitive, тогда where upper(text) like upper('%фраза поиска%'). В принципе лучше всегда стараться сменить in на join.

Ответить

Номер ответа: 11
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #11 Добавлено: 12.06.04 00:03

Извини, задурили голову (отвечал с работы) конечно надо так:

select m1.id, m1.subject, m1.text
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-сайт: www.vbnet.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #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. Значение поля одинаково для всех сообщений темы, не так ли?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам