Поиск/выборка с окрестностью для икомого слова/фразы

добрый эх

Новичок
Поиск/выборка с окрестностью для икомого слова/фразы

Есть поиск по сайту.

Выбираются несколько символьных/текстовых полей (`title`, `content`)
для некоторого слова/фразы.

Поле поле таблицы `content` может содержать много текста.

Как можно при помощи только SQL выбирать часть текста поля именно для
окрестности икомого слова/фразы. Т.е где-то в середине (не в начале), где
содержится слово. Как, например, при выводе в google.

Спасибо.
 

добрый эх

Новичок
Автор оригинала: hermit_refined я, конечно, не работаю в гугле, но с уверенностью могу вам сказать - они не используют sql для определения нужного куска.
Ну я ж не про это задавал вопрос (чем занимается google), а как нужный SQL написать.
 

hermit_refined

Отшельник
это был ответ на вопрос, как при помощи sql сделать "как в google".
сформулируйте тогда задачу точнее.
 

добрый эх

Новичок
Автор оригинала: hermit_refined
это был ответ на вопрос, как при помощи sql сделать "как в google".
сформулируйте тогда задачу точнее.
Просто надо выдрать кусок текста где есть икомое слово,
а не все поле. Чтоб не нагружать php текстами десятков/сотен килобайт. Тексты большие.
 

hermit_refined

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

четко формализуйте свои желания.
 

добрый эх

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

четко формализуйте свои желания.
Вот для этого я ж и привел пример google.
Ну давай если можешь пример sql хотя б для одного слова (то что ты смог предположить).
 

hermit_refined

Отшельник
они могут быть тут.
если будет указана достаточная сумма,
если речь как минимум о VDS,
если забудете о sql,
и начнете выражаться внятно.
Автор оригинала: WP
Это делается регулярками, не в SQL.
скорость, и главное - качество, будут оставлять желать лучшего.
 

добрый эх

Новичок
Автор оригинала: WP
Это делается регулярками, не в SQL.
... я не против, но для текстов по 100кб?... Сервер сдохет сразу.

Вот, нашел боле-менее по-теме подходящее.
http://phpclub.ru/talk/showthread.php?s=&threadid=25330&highlight=FULLTEXT.

-~{}~ 02.03.07 21:45:

Автор оригинала: hermit_refined
они могут быть тут.
если будет указана достаточная сумма
Посмотри лучше мою ссылку, бесплатно.
А на ту ссылку что ты привел тебе еще рано заходить:D
 

WP

^_^
> ... я не против, но для текстов по 100кб?... Сервер сдохет сразу.
Гон.

Если нагрузка на сервер небольшая, то можно вполне обойтись регулярными выражениями в PHP (как я это сделал в своем выводе сниппетов), если речь идет о серьезной нагрузке и гигантских текстах - имеет смысл сделать следующее:
создать таблицу с полями:
unsigned int wid - id псевдо-корня слова,
unsigned int tid - id индексируемого текста,
unsigned int fid - id фрагмента,
unsigned int pos - позиция первого символа текущего фрагмента,
unsigned int length - длинная текущего фрагмента
Индекс на wid+tid.

И при внесении (изменении) текста:
Разбить текст на фрагменты (например предложения), затем найти уникальные псевдо-корни слов встречающихся в каждом из фрагментов и вставить в БД для каждого псевдо-корня ряд в вышеописанной таблице. Как видно - она состоит из одних целых чисел, поэтому легко большое количество рядов не будет проблемой.

При поиске, нужно найти уникальные псевдо-корни слов встречающихся в запросе, и составить запрос:[sql]SELECT `tid`, SUBSTRING(text,pos,length) AS `snippet` FROM `indextable` LEFT JOIN `texts` ON `indextable`.`tid` = `texts`.`id` WHERE `wid` IN(/*...список id псевдо-корней слов из запроса...*/) GROUP BY `fid`[/sql]
Далее полученный результате нужно склеить.

id псевдо-корня вычисляется в зависимости от морфологического движка, в общем случае им может служить контрольная сумма.
 

добрый эх

Новичок
WP,
В общем я идею понял. Спасибо.
Но как-то сложновато и громоздко получается.

Я просто хотел сразу что-то типа "регулярного" SUBSTRING-a
или аналогичных манипуляций прям в SELECT-e.
 

WP

^_^
Почему громоздко? Очень шустро и компактно помоему. Размер таблицы сравним с размером индекса.

> Я просто хотел сразу что-то типа "регулярного" SUBSTRING-a
или аналогичных манипуляций прям в SELECT-e.
Дык лагало бы жуть как.
 
Сверху